C# 如何使用SqlCommand和DataAdapter使用C操作SQL Server

C# 如何使用SqlCommand和DataAdapter使用C操作SQL Server,c#,sql,sql-server,visual-studio,C#,Sql,Sql Server,Visual Studio,我创建了一个名为Department的表,该表有两列Department ID,即自动递增和Department Name 我创建一个部门,以便遍历部门行 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 se

我创建了一个名为Department的表,该表有两列Department ID,即自动递增和Department Name

我创建一个部门,以便遍历部门行

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);
    }
问题是:

单击“清除”按钮后,我将部门名称插入“部门名称”文本框,然后单击“添加”按钮。我插入的名称未保存在数据库中,如果我单击“上一步”然后单击“下一步”以查看我插入的内容,则在Navigate\u Department方法中会出现索引超出范围异常


我犯了什么错误吗?

您插入的名称没有保存在数据库中的原因是因为您从未执行insert命令。加:

int ret = Dep_da.Update(Dep_ds);

after the

Dep_da.InsertCommand = insCmd;
变量ret将包含成功更新的插入行数-在您的情况下应为1


为了补充@N.Warfield所写的内容,如果您只是将原始数据附加到用户或其他系统提供的SQL字符串中,那么您将面临SQL注入攻击。

您不应该像这样创建insert语句,而应该使用带有insert命令的数据适配器,向表中添加一个新的DataRow实例,然后使用数据适配器执行更新


或者,您可以通过将对Dep_da.InsertCommand=insCmd的调用替换为insCmd.ExecuteNonQuery,在Dep_Add_Click中执行insert命令,但是,这意味着您需要重新运行select语句并从数据库中重新填充数据集,以便将数据从数据库中获取到数据集。

将SQL查询参数化。不要将文本框值附加到SQL字符串中。执行程序更新时会出现此错误,因为无法找到TableMapping['Table']或DataTable'Table'。请尝试在更新方法中指定表名-即Dept_da.UpdateDep_ds,Department;