2009-08-07 22 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

我們可以省略@符號。 –