如何使用 SqlCommand 和 DataAdapter 以使用 C# 操作 SQL Server
Posted
技术标签:
【中文标题】如何使用 SqlCommand 和 DataAdapter 以使用 C# 操作 SQL Server【英文标题】:How to use SqlCommand and DataAdapter in order to manipulate SQL Server with C# 【发布时间】:2011-07-02 18:06:07 【问题描述】:我创建了名为 Department
的表,其中包含 2 列 Department ID
和 Department Name
,这是自动递增的
我创建Navigate_Department()
以便遍历部门行
System.Data.SqlClient.SqlConnection con;
DataSet Dep_ds;
System.Data.SqlClient.SqlDataAdapter Dep_da;
int Dep_MaxRows = 0;
int Dep_inc = 0;
private void ILS_Load(object sender, EventArgs e)
con = new System.Data.SqlClient.SqlConnection();
con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\ILS_DB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
con.Open();
Dep_ds = new DataSet();
string sql2 = "select * from Department order by DepartmentID";
Dep_da = new System.Data.SqlClient.SqlDataAdapter(sql2, con);
Dep_da.Fill(Dep_ds, "Department");
Navigate_Department();
Dep_MaxRows = Dep_ds.Tables["Department"].Rows.Count;
private void Navigate_Department()
DataRow dRow = Dep_ds.Tables["Department"].Rows[Dep_inc];
Dep_ID.Text =dRow.ItemArray.GetValue(0).ToString();
Dep_Name.Text = dRow.ItemArray.GetValue(1).ToString();
private void Move_Next_Click(object sender, EventArgs e)
if (Dep_inc != Dep_MaxRows-1)
Dep_inc++;
Navigate_Department();
else
MessageBox.Show("No More Records");
private void Move_back_Click(object sender, EventArgs e)
if (Dep_inc > 0)
Dep_inc--;
Navigate_Department();
else
MessageBox.Show("First Record");
private void Dep_Clear_Click(object sender, EventArgs e)
Dep_ID.Clear();
Dep_Name.Clear();
private void Dep_Add_Click(object sender, EventArgs e)
try
SqlCommand insCmd = new SqlCommand("insert into dbo.Department (DepartmentName) values ('" + Dep_Name.Text + "')", con);
Dep_da.InsertCommand = insCmd;
Dep_MaxRows = Dep_MaxRows + 1;
Dep_inc = Dep_MaxRows - 1;
Dep_Max.Text = Dep_MaxRows.ToString();
Dep_Current.Text = (Dep_MaxRows).ToString();
catch (Exception exceptionObject)
MessageBox.Show(exceptionObject.Message);
问题是:
单击清除按钮后,我将部门名称插入Dep_Name
文本框,然后单击添加按钮。我插入的名称没有保存在数据库中,如果我单击后退然后移动下一步以查看我插入的内容,我会在 Navigate_Department()
方法中收到 Index out of range
异常。
那我有错吗?
【问题讨论】:
参数化您的 SQL 查询。不要将文本框值附加到 SQL 字符串中。 【参考方案1】:您插入的名称未保存在数据库中的原因是您从未执行过插入命令。添加:
int ret = Dep_da.Update(Dep_ds);
after the
Dep_da.InsertCommand = insCmd;
变量 ret 将包含成功更新(插入)的行数 - 在您的情况下应该是 1。
要添加到@N。 Warfield 写道,如果您只是将原始数据附加到用户(或其他系统)提供的 SQL 字符串中,您就会对 SQL 注入攻击敞开大门。
【讨论】:
执行程序“更新无法找到TableMapping['Table'] or DataTable 'Table'”时出现此错误。 尝试在Update方法中指定表名——即Dep_da.Update(Dep_ds, "Department");【参考方案2】:而不是像这样创建插入语句,您应该使用带有插入命令的数据适配器,向表中添加一个新的 DataRow 实例,然后使用数据适配器执行更新。
或者,您可以通过将“Dep_da.InsertCommand = insCmd”调用替换为“insCmd.ExecuteNonQuery”来在 Dep_Add_Click 中执行插入命令,但这意味着您需要重新运行 select 语句并重新填充数据集从数据库中获取数据到数据集中。
【讨论】:
以上是关于如何使用 SqlCommand 和 DataAdapter 以使用 C# 操作 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SqlCommand::Execute(或替代方法)从同一存储过程中“选择 *”和“选择计数(*)”?
如何使用替换的参数捕获 SQL? (.NET,SqlCommand)
如何在 SSIS 脚本组件中使用 OLEDB 连接执行 SqlCommand