MySql Says Column не может быть нулевым для столбца, который не является нулевым! [используя именованные параметры] - PullRequest
4 голосов
/ 07 августа 2009

Я пытаюсь выполнить запрос INSERT INTO, используя .Net через соединитель MySql / .NEt. Запрос использует параметры. Это довольно просто:

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

В чем может быть причина того, что у меня такое поведение?

Ответы [ 6 ]

7 голосов
/ 08 августа 2009

Хорошо, ребята, я наконец нашел правильный ответ.

Проблема заключалась просто в том, что в запросах 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 голосов
/ 07 августа 2009

Разве строка не должна выглядеть так:

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

или вы можете опустить символ @?

0 голосов
/ 07 августа 2009

Не слишком язвительный, но вот почему тестовые примеры - хорошая вещь. Напишите модульный тест для проверки того, что передача ненулевого posturl будет работать, а передача нулевого post приведет к получению этой ошибки из базы данных.

Затем напишите интеграционный тест (или макет), чтобы доказать, что postOld.URL не равен нулю.

0 голосов
/ 07 августа 2009

Попробуйте переместить post_url перед содержимым в списках параметров и значений, чтобы исключить возможность того, что драйвер плохо передал параметры в MySQL из-за сложного значения в @ content.

0 голосов
/ 07 августа 2009

У вас есть триггер вставки в эту таблицу? Возможно, триггер пытается вставить в другую таблицу, в которой есть столбец post_url, который не может быть пустым.

0 голосов
/ 07 августа 2009

Непосредственно перед вызовом метода Execute, можете ли вы проверить, чтобы увидеть, какое значение есть в каждом параметре? Очень легко случайно сделать что-то, что испортило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...