为啥我们要使用 sqlcommandbuilder?
Posted
技术标签:
【中文标题】为啥我们要使用 sqlcommandbuilder?【英文标题】:why we going for sqlcommandbuilder?为什么我们要使用 sqlcommandbuilder? 【发布时间】:2011-10-19 08:31:22 【问题描述】:选项1:在数据库中插入数据
SqlCommand cmd = new SqlCommand("INSERT INTO table_name(eid,eName,Dept) values('"+ textBox1.Text +"','"+ textBox2.Text +"','"+ Textbox3.Text +"'", con);
cmd.ExecuteNonQuery();
选项2:
SqlDataAdapter sqlda = new SqlDataAdapter("SELECT * FROM table_name",con);
SqlCommandBuilder sqlcomb = new SqlCommandBuilder(sqlda);
DataSet dset = new DataSet("table1");
sqlda.Fill(dset,"table1");
DataRow drow = dset.Tables["table1"].NewRow();
drow["eid"] = textBox1.Text.ToString();
drow["eName"] = textBox2.Text.ToString();
drow["Dept"] = textBox3.Text.ToString();
dset.Tables["table1"].Rows.Add(drow);
sqlda.Update(dset, "table1");
我的问题是,我觉得 option1 是最好的插入方法。为什么我们使用SqlCommandBuilder
插入数据? SqlCommandBuilder 有什么用?使用SqlCommandBuilder
插入数据有什么好处?请给个建议
【问题讨论】:
【参考方案1】:我总是选择选项 3:参数化查询 !!
不要将你的 SQL 语句连接在一起 - N E V E R
如果您这样做 - 请参阅 what will happen eventually.....
它们既可以安全地抵御 SQL 注入攻击,也更高效(因为如果您使用多个参数值调用它,可以重复使用单个查询计划):
string insertStmt = "INSERT INTO dbo.table_name(eid, eName, Dept) " +
"VALUES(@eid, @eName, @dept)";
SqlCommand cmd = new SqlCommand(insertStmt, con);
cmd.Parameters.Add("@eid", SqlDbType.Int).Value = .......;
cmd.Parameters.Add("@ename", SqlDbType.VarChar, 50).Value = .......;
cmd.Parameters.Add("@dept", SqlDbType.VarChar, 100).Value = .......;
cmd.ExecuteNonQuery();
或者然后选项 4:使用 ORM(对象关系映射器),如 Dapper-Dot-Net 或 Entity Framework 将您的关系数据转换为可在 .NET 中使用的好对象(最后忘记玩弄DataRow
和DataColumn
之类的东西)??
【讨论】:
以上是关于为啥我们要使用 sqlcommandbuilder?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Convert 语句的 SqlCommandBuilder
使用没有主键的 SQLAdapter 和 SQLCommandBuilder
在 ASP.NET 中使用 SqlCommandBuilder
SQLCommandBuilder - 仅从 DataTable 更新“追加”数据库表