在ASP.NET中向数据库插入数据引发异常
我正在尝试使用以下代码将数据插入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
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没有提供实际的异常。。所以我刚刚建议他使用这样的代码,也许他的问题会得到解决。你对原始的操作代码做了另一个实质性的更改,我打赌正是这个更改更有可能修复操作代码。但你不解释,这是我评论的意思。