0

我正在尝试使用以下代码将数据插入 ASP.NET 中的数据库:

string conn = "TJLDatabaseConnectionString";
conn = ConfigurationManager.ConnectionStrings["Conn"].ToString();
SqlConnection objsqlconn = new SqlConnection(conn);
objsqlconn.Open();
SqlCommand objcmd = new SqlCommand("Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) Values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')", objsqlconn);
objcmd.ExecuteNonQuery();
//MessageBox.Show("Successful");

但是当我运行它时。它给出以下消息:

4

3 回答 3

2

首先重要的是,始终使用 sql-parameters 来防止 sql-injection。永远不要将参数连接到 sql 查询中。这也可以解决本地化或“转义”问题。

此外,使用该using语句来确保任何使用非托管资源(如 sql-connection)的东西都将被关闭和处理,即使出现错误:

string sql = @"
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption)";

using(var objsqlconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
using (var cmd = new SqlCommand(sql, objsqlconn))
{
    cmd.Parameters.AddWithValue("@MachineName", TextBox1.Text);
    cmd.Parameters.AddWithValue("@LastReading", TextBox2.Text);
    cmd.Parameters.AddWithValue("@CurrentReading", TextBox3.Text);
    cmd.Parameters.AddWithValue("@Consumption", TextBox4.Text);
    objsqlconn.Open();
    int insertedCount = cmd.ExecuteNonQuery();
}

旁注:如果您有一个标识列并且想要检索新创建的主键,请使用SCOPE_IDENTITYExecuteScalar即使您使用INSERT INTO

string sql = @"
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption); 
SELECT CAST(scope_identity() AS int)";

//...
int newID = (int)cmd.ExecuteScalar();
于 2013-10-11T08:38:25.200 回答
0

使用变量检查行是否受到影响

 rowAffected= objcmd.ExecuteNonQuery();
             if(rowAffected >0)
              {
                //sucessful
              }
             else
              {
                //
              }
于 2013-10-11T08:38:06.060 回答
0

由于您的问题中没有提到任何异常,因此只是为了获得更好且可读的代码,我建议您也使用 using 块。它为您提供了漂亮、干净和可读的代码,并且还可以在对象超出范围时处理它们。

这是为了我们在编码时通常遵循的良好实践。请向我们展示适当解决方案的例外情况。

private void ConnectToDb()
{

var conn = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
using( var conn = new SqlConnection(conn))
{
 conn.Open();
 var cmdtxt ="Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
Values(@P1,@P2,@P3,@P4)";
 using(var cmd = new SqlCommand(cmdtxt, conn))
 {
   cmd.CommandType=CommandType.Text;
   cmd.Parameters.AddWithValue("@P1", TextBox1.Text);
   cmd.Parameters.AddWithValue("@P2", TextBox2.Text);
   cmd.Parameters.AddWithValue("@P3", TextBox3.Text);
   cmd.Parameters.AddWithValue("@P4", TextBox4.Text);
   cmd.ExecuteNonQuery();

 }
 con.close();
}
}
于 2013-10-11T08:35:55.403 回答