• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Не удается правильно задать типы полей в параметрах команды вставки.

  • Автор темы vitvikt
  • Дата начала
V

vitvikt

Пытаюсь реализовать пример обновления данных на сервере, приведенный в книге Сеппа “Программирование ADO.net 2.0”
Однако использую не MSSql, а MySql 5.0.11

Не удается правильно задать типы полей в параметрах команды вставки.
При попытке обновления, выдается сообщение
“Column 'CustomerID' cannot be null”.
Если вместо параметров в команде задать конкретные значения, обновление срабатывает.
Отсюда делаю вывод, что виновата строчка
OrdersAdapter.InsertCommand.Parameters.Add("?CustomerID", MySqlDbType.String, 15, "`Orders`.`CustomerID`");
В базе тип CustomerID – int(15).
Перепробовал разные варианты MySqlDbTyp.
Не помогает.

В чем может быть дело?
Ниже функция целиком:


static void CreateHierarchicalUpdatingLogic(MySqlDataAdapter OrdersAdapter, MySqlDataAdapter DetailsAdapter)
{
MySqlCommandBuilder cbOrders = new MySqlCommandBuilder(OrdersAdapter);
MySqlCommandBuilder cbDetails = new MySqlCommandBuilder(DetailsAdapter);
string strSQL;
strSQL = "INSERT INTO `CIT55`.`Orders` (CustomerID, OrderDate) " +
" VALUES (?CustomerID, ?OrderDate);" + // срабатывает " VALUES ('abcd', '1800-01-01');" +
"SELECT ?OrderID = LAST_INSERT_ID()"; //всмсто "SELECT ?OrderID = SCOPE_IDENTITY()";

OrdersAdapter.InsertCommand = new MySqlCommand(strSQL, OrdersAdapter.SelectCommand.Connection);

// В варианте MSSql у Сеппы это выглядит так
/*
OrdersAdapter.InsertCommand = new SqlCommand(strSQL, OrdersAdapter.SelectCommand.Connection);
OrdersAdapter.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
OrdersAdapter.InsertCommand.Parameters.Add("@OrderDate", SqlDbType.DateTime, 0, "OrderDate");
OrdersAdapter.InsertCommand.Parameters.Add("@OrderID", SqlDbType.Int, 0, "OrderID").Direction = ParameterDirection.Output;
OrdersAdapter.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
*/
//Я заменяю тип на MySqlDbType.String. Не помогают и другие варианты
OrdersAdapter.InsertCommand.Parameters.Add("?CustomerID", MySqlDbType.String, 15, "`Orders`.`CustomerID`");
OrdersAdapter.InsertCommand.Parameters.Add("?OrderDate", MySqlDbType.Datetime, 0, "`Orders`.`OrderDate`");
OrdersAdapter.InsertCommand.Parameters.Add("?OrderID", MySqlDbType.String, 20, "`Orders`.`OrderID`").Direction = ParameterDirection.Output;
OrdersAdapter.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;

OrdersAdapter.UpdateCommand = cbOrders.GetUpdateCommand();
OrdersAdapter.DeleteCommand = cbOrders.GetDeleteCommand();

DetailsAdapter.InsertCommand = cbDetails.GetInsertCommand();
DetailsAdapter.UpdateCommand = cbDetails.GetUpdateCommand();
DetailsAdapter.DeleteCommand = cbDetails.GetDeleteCommand();
}
 
T

TaTTDoGG

а что если попробовать так:
Код:
OrdersAdapter.InsertCommand.Parameters.AddWithValue("?p1",param);
а потом в запросе использовать ?p1

тип переменной param определится сам.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!