ADO.NET数据库查询

谁能给我解释一下下面三种向数据库中插入数据的不同:现谢谢了!!还有就是为什么第三种方法的cmd.Parameters.Add(newSqlParameter("@yu_t... 谁能给我解释一下下面三种向数据库中插入数据的不同:
现谢谢了!!

还有就是为什么第三种方法的cmd.Parameters.Add(new SqlParameter("@yu_tm", SqlDbType.DateTime));一定要把变量定义成DateTime类型的;
而前两种就不用定义;(数据库中字段"yu_tm"的类型为DateTime型)

string a = TextBox1.Text.ToString();
string b = TextBox2.Text.ToString();
string c = TextBox3.Text.ToString();
string d = Label1.Text.ToString();
Response.Write(d);
string connectionstring = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection cnn = new SqlConnection(connectionstring);

string sql = "insert into yu_pm(yu_name,yu_pm_sj,yu_pm_ch,yu_tm) values('" + a + "','" + b + "','" + c + "','" + d + "')";
SqlCommand cmd = new SqlCommand(sql, cnn);
cnn.Open();
SqlDataReader red = cmd.ExecuteReader();
red.Close();
cmd.ExecuteNonQuery();
cnn.Close();
GridView1.DataBind();
Response.Redirect("datareader_Test1.aspx");

这里的数据库连接跟上面的一样
string sql = "insert into yu_pm(yu_name,yu_pm_sj,yu_pm_ch,yu_tm) values('" + a + "','" + b + "','" + c + "','" + d + "')";
SqlCommand cmd = new SqlCommand(sql, cnn);
cnn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cnn.Close();
GridView1.DataBind();
Response.Redirect("datareader_Test1.aspx");

这里的数据库连接跟上面的一样
string sql = "insert into yu_pm(yu_name,yu_pm_sj,yu_pm_ch,yu_tm) values(@yu_name,@yu_pm_sj,@yu_pm_ch,@yu_tm)";
SqlCommand cmd = new SqlCommand(sql, cnn);
cnn.Open();
cmd.Parameters.Add(new SqlParameter("@yu_name", SqlDbType.NVarChar, 50));
cmd.Parameters["@yu_name"].Value = a;
cmd.Parameters.Add(new SqlParameter("@yu_pm_sj", SqlDbType.NVarChar, 10));
cmd.Parameters["@yu_pm_sj"].Value = b;
cmd.Parameters.Add(new SqlParameter("@yu_pm_ch", SqlDbType.NVarChar, 10));
cmd.Parameters["@yu_pm_ch"].Value = c;
cmd.Parameters.Add(new SqlParameter("@yu_tm", SqlDbType.DateTime));
cmd.Parameters["@yu_tm"].Value = d;
cmd.ExecuteNonQuery();
cnn.Close();
GridView1.DataBind();
Response.Redirect("datareader_Test1.aspx");
展开
 我来答
南南北北客家乡
2008-04-09 · 超过18用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:47.5万
展开全部
关于Sql注入的基本概念腊芦经典的注入语句是' or 1=1--
单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

简单的给个示例

传统的查询语句的sql可能为
string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";
很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);
_userid.Value = Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

当然,这仅是一个示例而已,在真实的桥局燃情况下,可能你还要对敏虚 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

所以,使用参数化的sql语句,是一种很好的做法,不过,我们也还有更好的办法,那就是使用参数化的存储过程,如果你有兴趣,可以继续探讨。
----转载
万山数据
2024-11-14 广告
实时数据仓库是北京万山数据科技有限公司重要的数据处理与存储解决方案。它专注于实时或近实时地捕获、存储和管理数据流,确保数据的高时效性和准确性。通过先进的数据处理技术和高效的存储架构,实时数据仓库能够支持复杂的数据分析需求,为企业决策提供即时... 点击进入详情页
本回答由万山数据提供
xtiawfn
2008-04-09 · 超过30用户采纳过TA的回答
知道答主
回答量:283
采纳率:0%
帮助的人:126万
展开全部
在你这几种方法中,建议你用第三种方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式