2009-08-07 26 views
4

我想通过MySql/.NEt连接器使用.Net执行INSERT INTO查询。该查询使用参数。这是相当简单:MySql表示列不能为null! [使用命名参数]

INSERT INTO post (
ID, content, post_url, blogID, title, addedOn, 
updatedDate, commentsFeedURL, active, viewCount, 
commentCount, languageID, authorName, postDate, 
posRating, negRating, adult) 
VALUES(
@ID, @content, @post_url, @blogID, @title, @addedOn, 
@updatedDate, @commentsFeedURL, @active, @viewCount, 
@commentCount, @languageID, @authorName, @postDate, 
@posRating, @negRating, @adult) 

当我运行它(与正式分配的所有参数),我得到一个错误

“列POST_URL“不能为空”

但它不是空。这是在参数POST_URL

http://abcd.wordpress.com/2007/08/13/%e0%a4%a6%e0%a5%8b-%e0%a4%ae%e0%a4%bf%e0%a4%a8%e0%a4%9f-%e0%a4%95%e0%a4%be-%e0%a4%a7%e0%a5%8d%e0%a4%af%e0%a4%be%e0%a4%a8/

的价值,这是我使用的参数分配给SQL查询的代码

cmd.Parameters.AddWithValue("post_url", postOld.URL); 

可能是什么,我得到这个的原因行为?

+0

你可以尝试打印出真实的查询字符串吗? –

+0

是的,实际的查询字符串是帖子的一部分。以'INSERT INTO'开头的位。尝试滚动它。 –

+0

也,你为什么不把你的字符串参数放在引号中? –

回答

7

好的伙计我终于找到了正确的答案。

这个问题很简单,就是在MySQL查询参数中标有'?'不是'@'。不幸的是,许多查询似乎运行良好(他们不是)使用'@',所以稍后有麻烦时会发现此问题。

谢谢你的答案。我重新写了我的这样的查询:

INSERT INTO post (ID, content, post_url, blogID, title, addedOn, updatedDate, commentsFeedURL, active, viewCount, commentCount, languageID, authorName, postDate, posRating, negRating, adult)" + 
          " VALUES(?ID, ?content, ?post_url, ?blogID, ?title, ?addedOn, ?updatedDate, ?commentsFeedURL, ?active, ?viewCount, ?commentCount, ?languageID, ?authorName, ?postDate, ?posRating, ?negRating, ?adult) 

它的工作。

+0

显然,MySql世界中没有人使用参数化查询。真是太浪费了! –

+0

PHP中带有PDO的命名参数使用冒号作为前缀(例如,“VALUES(:ID)”),并且只有未命名的参数可用于MySQLi扩展,用问号分隔(例如,“VALUES(? )“),所以我不会发现这个错误,不熟悉C#。 – gapple

0

就在您调用Execute方法之前,您可以检查然后查看每个参数中的值是什么?意外地做一些混乱的事情很容易。

+0

是的,我确实检查过。这与我提供的价值相同。 –

+0

好的......也许暂时允许该列上的NULL,然后查看插入的内容。 –

+0

那么,我发现什么是错的。 –

0

你在该表上有插入触发器吗?可能是因为触发器试图插入另一个具有不能为null的post_url列的表。

0

尝试在参数和值列表中的内容之前移动post_url以排除由于@content中的复杂值而导致驱动程序严重地将参数传递给MySQL的可能性。

+0

我也这么想过,于是我创建了一个SQLEncode函数来正确编码内容中的任何值。不起作用。 –

+0

不过,是不是值得一试,只是为了看看会发生什么? – BlueMonkMN

+0

没有帮助。但我最终得到了正确的答案。 –

0

在这里并没有被人嘲笑,但这就是为什么测试用例是一件好事。编写一个单元测试来验证传递非空posturl是否可行,并传递一个null将从数据库中获取此错误。

然后编写一个集成测试(或模拟)来证明postOld.URL非空。

+0

那么,postold.URL不是null。 –

0

不宜行是这样的:

cmd.Parameters.AddWithValue("@post_url", postOld.URL); 

也可以忽略@符号?

+0

我们可以省略@符号。 –