如何使用 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 IDDepartment 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(或替代方法)从同一存储过程中“选择 *”和“选择计数(*)”?

如何使用 SqlCommand 返回多个结果集?

如何使用替换的参数捕获 SQL? (.NET,SqlCommand)

如何在 SSIS 脚本组件中使用 OLEDB 连接执行 SqlCommand

如何使用 SqlCommand 创建具有参数化数据库名称的数据库?

使用 sqlcommand 填充 reportviewer 但仅从一个表中填充选定的字段如何添加另一个表?