执行此查询时出现错误,因为列文本也可能包含带单引号的文本。如何使用此查询没有任何错误 我的代码是
public bool updateCMStable(int id, string columnName, string columnText)
{
try
{
string sql = "UPDATE CMStable SET " + columnName +
"='" + columnText + "' WHERE cmsID=" + id;
int i = SqlHelper.ExecuteNonQuery(Connection.ConnectionString,
CommandType.Text,
sql);
if (i > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ee)
{
throw ee;
}
}
答案 0 :(得分:5)
您应该使用parameterized queries而不是在字符串中构建SQL - 除了单引号问题外,您当前的代码容易受到SQL Injection的攻击。</ p>
您有一个限制,即您尝试使用无法参数化的动态列名,但您仍然可以更安全地使用动态SQL。
我建议阅读Erland Sommarskog的The Curse and Blessings of Dynamic SQL来全面处理这个问题。
答案 1 :(得分:0)
要修复您的代码,请使用额外的单引号转义所有单引号。 但是我同意Oded ...你需要使用参数化查询,或者可能是存储过程。
public bool updateCMStable(int id, string columnName, string columnText)
{
if(!string.IsNullOrEmpty))
{
switch(columnName)
{
// TODO: change 50 & 100 to the real sizes of your columns,
// and obviously the column names too...
case "column1":
if(columnText.Length > 50)
columnText = columnText.SubString(0, 50);
break;
case "column2":
if(columnText.Length > 100)
columnText = columnText.SubString(0, 100);
break;
etc...
}
}
// replace single quote with double single quotes
columnText = columnText.Replace("'", "''");
string sql = string.Format("UPDATE CMStable SET {0} = '{1}' WHERE cmsID={2}",
columnName,
columnText,
id);
int i = SqlHelper.ExecuteNonQuery(Connection.ConnectionString, CommandType.Text, sql);
return (i > 0);
}
我对您的代码进行了一些额外的更正。
throw
,或者你将重置堆栈跟踪。不要使用throw ee
; 修改:
您发布的错误正在发生,因为传入的数据长度超过了列的指定长度。由于您使用的是动态SQL,因此我能看到的唯一方法就是使用case语句。每个字段可能具有不同的大小,或者可能不是,但是必须截断字符串以适应以避免错误。如果所有字段大小相同,则不需要case语句。
答案 2 :(得分:0)
错误是
“字符串或二进制数据将被截断。语句已被终止”
此错误的主要原因是您尝试保存任何值的列的长度较短,假设您的列是varchar(100)
类型并且您尝试在其中保存105个字符的字符串然后你会收到这个错误。
答案 3 :(得分:0)
使用LinqToSql。请.......有很多原因可以解释为什么编写上面列出的代码并不是一个好主意 - 安全性,设计,理智......
Google LinqToSql和“Repository Pattern”作为编写可维护,有用的数据交互的基本起点。
答案 4 :(得分:0)
试试这个:
public bool updateCMStable(int id, string columnName, string columnText)
{
try
{
columnText=columnText.Replace("'","''")
string sql = "UPDATE CMStable SET " + columnName +
"='" + columnText + "' WHERE cmsID=" + id;
int i = SqlHelper.ExecuteNonQuery(Connection.ConnectionString,
CommandType.Text,
sql);
if (i > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ee)
{
throw ee;
}
}
答案 5 :(得分:0)
public bool updateCMStable(int id, string columnName, string columnText)
{
try
{
string sql = "UPDATE CMStable SET '"+columnName+"' = '"+columnText+"' where cmdID='"+id+"'";
int i = SqlHelper.ExecuteNonQuery(Connection.ConnectionString,CommandType.Text,sql);
if (i > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ee)
{
throw ee;
}
}