1

执行此查询时出现错误,因为列文本也可能包含带单引号的文本。我如何在没有任何错误的情况下使用此查询我的代码是

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;
    }
} 
4

6 回答 6

5

您应该使用参数化查询,而不是在字符串中构造 SQL - 您当前的代码,除了单引号问题外,还容易受到SQL 注入的影响。

有一个限制是您尝试使用无法参数化的动态列名,但您仍然可以以更安全的方式使用动态 SQL。

我建议阅读Erland Sommarskog 的The Curse and Blessings of Dynamic SQL以全面了解该主题。

于 2012-07-07T10:39:12.483 回答
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); 
}

我对您的代码做了一些额外的更正。

  1. 当您返回 true | 时,您可以简单地返回 if 语句的结果。错误的
  2. 如果您只是将异常扔到 catch 块中,则不需要捕获异常
  3. 如果你确实捕获了一个异常,对它做一些有意义的事情,并决定重新抛出它,单独使用throw它,或者你将重置堆栈跟踪。不要使用throw ee;
  4. 如果它变得太不可读,请用 string.Format 替换 + 类型连接。

编辑:

您发布的错误正在发生,因为传入的数据长度大于列的指定长度。由于您使用的是动态 SQL,因此我能看到的唯一解决方法是使用 case 语句。每个字段可能有不同的大小,也可能没有,但必须截断字符串以适应以避免错误。如果所有字段大小都相同,则不需要 case 语句。

于 2012-07-07T10:44:21.743 回答
0

错误是

“字符串或二进制数据将被截断。语句已终止”

此错误的主要原因是您尝试保存任何值的列的长度较短,假设如果您的列是varchar(100)类型并且您尝试在其中保存一个 105 个字符的字符串,那么您将收到此错误。

于 2012-07-07T10:54:47.070 回答
0

使用LinqToSql。拜托.. 上面列出的编写代码不是一个好主意的原因有很多——安全性、设计、理智....

Google LinqToSql 和“存储库模式”作为编写可维护、有用的数据交互的基本起点。

于 2012-07-07T10:54:51.233 回答
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;
    }
} 
于 2012-07-19T11:07:57.673 回答
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;
    }
} 
于 2013-11-27T17:27:14.587 回答