我有一个用于更新数据库的类方法..但它不起作用,我找不到有什么问题..
try catch
块中没有错误.. id
的数据库类型为int
且catagory
的类型为nvarchar(50)
。
我也尝试将id
从int
转换为string
但不起作用且没有错误..
数据库列名和变量名相同。连接字符串保存在web.config
文件中,该文件用于插入数据。
public string update(int id, string catagory)
{
//creating database connection
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
string error = "";
try
{
//firing command
string strCommand = "UPDATE Data SET catagory = '" + catagory + "' WHERE (id = '" + id + "')";
SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
objCommand.ExecuteNonQuery();
}
catch(System.Data.SqlClient.SqlException ex)
{
error = ex.ToString();
}
//closing database connection
objConnection.Close();
return error;
}
答案 0 :(得分:3)
如果id
列为int
,则无需使用单引号。只需像WHERE (id = " + id + ")
一样使用它。单引号用于字符列类型。
您应始终使用 parameterized queries 。这种字符串连接对 SQL Injection 攻击开放。
string strCommand = "UPDATE Data SET catagory = @catagory WHERE id = @id";
SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
objCommand.Parameters.AddWithValue("@catagory", catagory);
objCommand.Parameters.AddWithValue("@id", id);
objCommand.ExecuteNonQuery();
在SQL Server的未来版本中,DATA
也可能是 reserved keyword 。您可能需要在将来的方括号中使用它,例如[DATA]
。
请使用using
statement来处理您的SqlConnection
和SqlCommand
。
答案 1 :(得分:1)
问题: DATA
可能是未来版本的SqlServer中的保留字。
来自MSDN:
可以在SQL Server的未来版本中将数据保留为新数据 功能已实现。
解决方案:将保留字括在方括号中[data]
试试这个:
string strCommand = "UPDATE [Data] SET catagory = '" + catagory + "' WHERE (id = " + id + ")";
建议1:您不需要将整数参数括在单引号中。
建议2:您的更新查询对sqlinjection攻击开放,请使用参数化查询来避免它们。
建议3:您可以使用return
方法的ExecuteNonQuery()
值来识别UPDATE
命令的状态。
使用Parameterised Queries
try
{
//firing command
string strCommand = "UPDATE [Data] SET catagory = @catagory WHERE (id =@id)";
SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
objCommand.Parameters.AddWithValue("@catagory",catagory);
objCommand.Parameters.AddWithValue("@id",id);
int status;
status = objCommand.ExecuteNonQuery();
if(status>0)
MessageBox.Show("Data Updated Successfully!");
else
MessageBox.Show("Update Failed!");
}
答案 2 :(得分:0)
始终使用参数化查询,用于反injection。
using statement
会自动处理并关闭您的sql connection
和sql command
public string update(int id, string catagory)
{
//creating database connection
using( SqlConnection objConnection = new SqlConnection(strConnection))
{
objConnection.Open();
string error = "";
try
{
string strCommand = "UPDATE Data SET catagory = @catagory WHERE id = @id ";
using( SqlCommand objCommand = new SqlCommand(strCommand, objConnection))
{
objCommand.Parameters.AddWithValue("@catagory",catagory);
objCommand.Parameters.AddWithValue("@id",id);
objCommand.ExecuteNonQuery();
}
}
catch(System.Data.SqlClient.SqlException ex)
{
error = ex.ToString();
}
return error;
}
}