2012-03-21 116 views
2

我有一个包含sql语句的方法。它是如何在sql查询中解决最大长度误差(它太长了)c#

public Boolean addRSS(string RSS_title, string Description, DateTime datetime, string RSS_Link, string user_name, float rate) 
    { 


     // Console.WriteLine(MyString.Remove(5, 10)); 
     // string a = date.ToString().Replace('.', '-'); 
     Boolean res = false; 
     string sql = "INSERT INTO My_RSS (RSS_Title,RSS_Description,RSS_Date,RSS_Link,RSS_Rate,UserName) values('" 
      + 
      RSS_title + "','" + 
      "FFFFFFFFFFFFFFFFFFFFFFFFFAAASDASDASDASD" + 
      "', SYSUTCDATETIME(),'" + 
      RSS_Link + "'," + 
      rate + ",'"+ 
      user_name + 
      "')"; 
     try 


     { 


      // hasan = hasan.Insert(c, hasan); 

      SqlCommand cmd = new SqlCommand(sql, Connect()); 
      cmd.ExecuteNonQuery(); 
      res = true; 
     } 
     catch (Exception) 
     { 
      res = false; 
     } 

     return res; 

    } 

当我试图进入该输入http://rss.feedsportal.com/c/32727/f/510887/s/1da50441/l/0Lekonomi0Bmilliyet0N0Btr0Cenflasyon0Eyuzde0E50Ee0Einene0Ekadar0Esikacak0E0Cekonomi0Cekonomidetay0C210B0A30B20A120C15181930Cdefault0Bhtm/story01.htm它给人的错误“链接栏”和 提示错误是 附近有语法错误“E”。 以'Lekonomi0Bmilliyet0N0Btr0Cenflasyon0Eyuzde0E50Ee0Einene0Ekadar0Esikacak0E0Cekonomi0Cekonomidetay0C210B0A30B20A120C15181930Cdefau'开头的标识符太长。最大长度为128. 字符串')'后面未加上引号。

另外,在SQL侧起式柱为varchar(455)

+1

你的数据库是如何定义的? – 2012-03-21 13:50:43

+1

我愿意赌钱'RSS_title'包含一个'''字符,请确保您将它们转义('RSS_title.Replace(“'”,“''”)')。你当然应该使用参数化查询,但是现在可以在10秒内修复。 – Blindy 2012-03-21 14:01:38

+1

@Bindindy为什么推荐10秒修复而不是正确的修复? – dmck 2012-03-21 14:03:03

回答

12

该错误是说,标识符名称太长;这与未封闭的引号错误相结合意味着您可能错过了开盘报价。也就是说,你有这样的:

INSERT INTO Foo (A) VALUES (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') 

,而不是

INSERT INTO Foo (A) VALUES ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') 

你不应该通过建立字符串连接您的查询;这是原因之一。参数化查询将为您提供引用权。 (注:你不需要使用存储的特效使用参数化查询是。)

var sql = "INSERT INTO My_RSS (Title, Description, Date, Link, Rate, Name) 
      VALUES (@Title, @Desc, @PostDate, @Link, @Rate, @Name)"; 

SqlCommand cmd = new SqlCommand(sql, Connect()); 
cmd.Parameters.Add("@Title", SqlDbType.VarChar, 100).Value = RSS_title; 
cmd.Parameters.Add("@Desc", SqlDbType.VarChar, 8192).Value = RSS_description; 
cmd.Parameters.Add("@PostDate", SqlDbType.SmallDateTime).Value = DateTime.Now; 
cmd.Parameters.Add("@Rate", SqlDbType.Int).Value = rate; 

+0

第三个参数只对类型具有可变长度需要,比如varchar,并且它仅对查询解析器提示您的字符串有多大(例如参数可以更小* *它会很好;它的参数是*更大*你可能会得到截断错误)。通常你让它们匹配字段定义。对于int,日期等,可以将第三个参数保留;我会放一个日期参数给你看。 – 2012-03-21 16:51:38

8

你也可以关闭之前后“SQL”字符串和SET QUOTED_IDENTIFIER添加SET QUOTED_IDENTIFIER“ sql'

引用标识符开启/关闭: 这指定了使用双引号的设置。如果这是打开,双引号将用作SQL Server标识符(对象名称)的一部分。这在标识符也是SQL Server保留字的情况下非常有用。

sql = "SET QUOTED_IDENTIFIER OFF " + sql + " SET QUOTED_IDENTIFIER OFF "; 

SqlCommand cmd = new SqlCommand(sql, Connect()); 
cmd.ExecuteNonQuery(); 
res = true; 

你应该在这种情况下使用它。

+0

它帮助。日Thnx。 – Kings 2013-05-14 09:48:33