在ASP.NET中向数据库插入数据引发异常

在ASP.NET中向数据库插入数据引发异常,asp.net,Asp.net,我正在尝试使用以下代码将数据插入ASP.NET中的数据库: string conn = "TJLDatabaseConnectionString"; conn = ConfigurationManager.ConnectionStrings["Conn"].ToString(); SqlConnection objsqlconn = new SqlConnection(conn); objsqlconn.Open(); SqlCommand objcmd = new SqlCommand("In

我正在尝试使用以下代码将数据插入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");

但当我运行它时。它给出了以下信息:

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

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

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();
}
}

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

 rowAffected= objcmd.ExecuteNonQuery();
             if(rowAffected >0)
              {
                //sucessful
              }
             else
              {
                //
              }

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

另外,使用
using
语句确保使用非托管资源(如sql连接)的任何内容即使出现错误也将被关闭和释放:

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\u identity
ExecuteScalar
,即使使用
INSERT-in

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();

您忘了告诉异常消息。
它给出了以下消息
是什么?注意,您可能会受到SQL注入攻击:切勿将值组合到带有字符串连接的SQL语句中。使用参数化查询(
objcmd.parameters.Add(name,value)
)。看起来您的一个值可能有一个unscaped',使得查询代码和string/varchar值混合在一起。TJLDatabaseConnectionString的定义是什么?您应该得到一个向上投票,但您仍然无法解释为什么您的答案可以解决OP问题。@Steve,仍然OP没有提供实际的异常。。所以我刚刚建议他使用这样的代码,也许他的问题会得到解决。你对原始的操作代码做了另一个实质性的更改,我打赌正是这个更改更有可能修复操作代码。但你不解释,这是我评论的意思。