带有单引号的SQL查询

时间:2012-07-07 10:37:50

标签: c# .net sql database

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

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

6 个答案:

答案 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); 
}

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

  1. 当你返回true时,你可以简单地返回if语句的结果假
  2. 如果你只想把它扔进catch块
  3. ,你不需要捕获异常
  4. 如果你捕获异常,做一些有意义的事情,并决定重新抛出它,单独使用throw,或者你将重置堆栈跟踪。不要使用throw ee;
  5. 如果变得太难以理解,请用string.Format替换+ type concatination。
  6. 修改:

    您发布的错误正在发生,因为传入的数据长度超过了列的指定长度。由于您使用的是动态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;
    }
}