如何向SQL Server插入数据

26

我的代码有什么问题?我无法将数据插入到 MS SQL 中... 我使用 C# 作为前端,MS SQL 作为数据库...

name = tbName.Text;
userId = tbStaffId.Text;
idDepart = int.Parse(cbDepart.SelectedValue.ToString());

string saveStaff = "INSERT into tbl_staff (staffName,userID,idDepartment) " +
                   " VALUES ('" + name + "', '" + userId +"', '" + idDepart + "');";

SqlCommand querySaveStaff = new SqlCommand(saveStaff);

try
{
querySaveStaff.ExecuteNonQuery();
}
catch
{
//Error when save data

MessageBox.Show("Error to save on database");
openCon.Close();
Cursor = Cursors.Arrow;
}

6
在您的“tbStaffId”文本框中,您没有完全正确地输入“22',1); DELETE FROM tbl_staff; --”。完成此操作后,请了解SQL注入。 - lc.
感谢您的帮助。当我运行程序时,出现以下错误:“ExecuteNonQuery: Connection property has not been initialized.” - Azri Zakaria
1
请将此参数化! - Marc Gravell
抱歉...我是C#的新手..有人能解释一下参数的函数吗? - Azri Zakaria
3个回答

42

您需要设置Command对象的Connection属性并使用参数化查询而不是硬编码SQL,以避免SQL注入

 using(SqlConnection openCon=new SqlConnection("your_connection_String"))
    {
      string saveStaff = "INSERT into tbl_staff (staffName,userID,idDepartment) VALUES (@staffName,@userID,@idDepartment)";

      using(SqlCommand querySaveStaff = new SqlCommand(saveStaff))
       {
         querySaveStaff.Connection=openCon;
         querySaveStaff.Parameters.Add("@staffName",SqlDbType.VarChar,30).Value=name;
         .....
         openCon.Open();

         querySaveStaff.ExecuteNonQuery();
       }
     }

1
谢谢我的朋友们... 完成了!抱歉,我是C#的新手... :) - Azri Zakaria
2
@Chuki2:请注意,这个正确的答案没有try/catch块,并且确实有using块。你应该遵循这个例子。 - John Saunders
3
使用 using 语句块包装的连接对象不需要显式调用 Close() 方法。 - user2932053
3
推荐使用.AddWithValue()方法。 - Si8
@Floella 因为你几乎永远不应该使用try/catch块。我没有时间教你正确的异常处理,但是这里有一个思考过程可以帮助你。假装程序中根本没有异常处理。现在,最糟糕的情况是什么?你知道方法中的异常会“冒泡”到方法的调用者,如果没有处理。因此,如果没有异常处理,任何异常都会冒泡到程序的顶层,并且可能终止进程。如果正确使用using块,你将不会丢失资源。 - John Saunders
显示剩余7条评论

36

我认为你缺少将 Connection 对象传递给你的 command 对象。如果你使用 commandparameters 会更好。

using (SqlConnection connection = new SqlConnection("ConnectionStringHere"))
{
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = connection;            // <== lacking
        command.CommandType = CommandType.Text;
        command.CommandText = "INSERT into tbl_staff (staffName, userID, idDepartment) VALUES (@staffName, @userID, @idDepart)";
        command.Parameters.AddWithValue("@staffName", name);
        command.Parameters.AddWithValue("@userID", userId);
        command.Parameters.AddWithValue("@idDepart", idDepart);

        try
        {
            connection.Open();
            int recordsAffected = command.ExecuteNonQuery();
        }
        catch(SqlException)
        {
            // error here
        }
        finally
        {
            connection.Close();
        }
    }
}

抱歉... 我在C#方面还是新手.. 参数需要哪些函数? - Azri Zakaria
8
我认为不需要使用finally关键字,using语句的目的是在出现异常时也能处理连接的释放 https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx ,我有漏掉了什么吗? - Des Horsley

-5
string saveStaff = "INSERT into student (stud_id,stud_name) " + " VALUES ('" + SI+ "', '" + SN + "');";
cmd = new SqlCommand(saveStaff,con);
cmd.ExecuteNonQuery();

8
这个存在 SQL 注入攻击的风险。您应该使用 Command.Parameters 来传递参数。 - S.L. Barth
4
避免这个例子。正如S.L.Barth所提到的,这种做法容易受到SQL注入攻击的影响。 - Oden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接