Вы получаете нулевую ссылку, потому что вы создали и установили размер pram
, но не добавили к нему никаких объектов.Итак, у вас есть массив, заполненный нулями.Похоже, вы можете полностью исключить цикл for
и массив pram
, поскольку вы уже добавляете параметры в cmd
вне цикла.
Следующий код не нужен:
OdbcParameter[] pram = new OdbcParameter[19];
, а также
for (int i = 0; i < pram.Length; i++)
{
cmd.Parameters.Add(pram[i]);
}
Кроме того, вы должны установить значения каждого параметра следующим образом:
cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;
Итак, ваш блок try
будет выглядетьнапример:
try
{
conn.Open();
OdbcCommand cmd = new OdbcCommand(sql, conn);
cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;
cmd.Parameters.Add("@CUST_PHONE1", OdbcType.NVarChar, 50).Value = phone;
cmd.Parameters.Add("@CUST_PHONE2", OdbcType.NVarChar, 50).Value = phone2;
cmd.Parameters.Add("@CUST_FNAME", OdbcType.NVarChar, 50).Value = firstname;
cmd.Parameters.Add("@CUST_LNAME", OdbcType.NVarChar, 50).Value = lastname;
cmd.Parameters.Add("@BEST_TIME", OdbcType.NVarChar, 50).Value = besttime;
cmd.Parameters.Add("@COMPANY_NAME", OdbcType.NVarChar, 225).Value = companyname;
cmd.Parameters.Add("@NONPROFIT", OdbcType.NVarChar, 1).Value = nonprofit;
cmd.Parameters.Add("@REQ_DATE", OdbcType.Date, 10).Value = requesteddate;
cmd.Parameters.Add("@REQ_TIME", OdbcType.Time, 20).Value = requestedtime;
cmd.Parameters.Add("@ATTENDANCE", OdbcType.NVarChar, 50).Value = attendance;
cmd.Parameters.Add("@EVENT_TYPE", OdbcType.NVarChar, 50).Value = eventtype;
cmd.Parameters.Add("@OTHER_DESC", OdbcType.NVarChar, 225).Value = other;
cmd.Parameters.Add("@LEAD_SOURCE", OdbcType.NVarChar, 50).Value = leadsource;
cmd.Parameters.Add("@NOTES", OdbcType.NVarChar, 225).Value = notes;
cmd.Parameters.Add("@CATERING", OdbcType.NVarChar, 1).Value = catering;
cmd.Parameters.Add("@BAR", OdbcType.NVarChar, 1).Value = bar;
cmd.Parameters.Add("@DAMAGE_DEPOSIT", OdbcType.NVarChar, 19).Value = damagedeposit;
cmd.Parameters.Add("@DANCE_FLOOR", OdbcType.NVarChar, 19).Value = dancefloor;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
Из редактирования вашего вопроса я вижу, что это код, который вы используете, и я так понимаю, вы все еще получаете ту же ошибку?Скорее всего, это означает, что одно из значений, добавляемых в коллекцию параметров, является нулевым.Если вы проверяете их с помощью отладчика, все ли они имеют установленные значения?
Правка, еще раз:
Есть еще одна ошибка, которую я пропустил раньше.Команда SQL, которую вы написали для ODBC, неправильно использует параметры, о чем свидетельствует новая ошибка.
string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor)
VALUES (@SPECIALIST, @CUST_PHONE1, @CUST_PHONE2, @CUST_FNAME, @CUST_LNAME, @BEST_TIME, @COMPANY_NAME, @NONPROFIT, @REQ_DATE, @REQ_TIME, @ATTENDANCE, @EVENT_TYPE, @OTHER_DESC, @LEAD_SOURCE, @NOTES, @CATERING, @BAR, @DAMAGE_DEPOSIT, @DANCE_FLOOR)";
Должно быть:
string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
Обратите внимание, что я разбилсястрока кода для удобства чтения.Также важен порядок добавления параметров в коллекцию.Они должны быть в порядке, соответствующем столбцам (значение для eventspecialist
должно быть первым, значение для phon
секунд и т. Д.) Также может быть так, что ваши параметры должны называться так же, какимена столбцов, как подсказывает @shahkalpesh.
Команды ODBC используют ?
для доступа к параметрам, а не имя параметра, как это делают команды SQL.Пара ссылок по теме:
http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx
http://msdn.microsoft.com/en-us/library/8dcw81x5.aspx
Редактировать
Я замечаю, что вы проходите мимовсе значения метода как string
.Вам нужно будет преобразовать их в правильный тип и использовать правильный тип данных ODBC при добавлении параметров.Пожалуйста, смотрите эту ссылку для типов параметров ODBC.
Используйте любой тип столбца (varchar
, money
и т. Д.), И если ваши переменные (eventspecialist
и т. Д.)имеют неправильный тип, преобразуйте значения в правильный тип (как указано в ссылке) перед их добавлением.Например, cmd.Parameters.Add("@ATTENDANCE", OdbcType.Int).Value = Int32.Parse(attendance);
.Обратите внимание, что Int32.Parse
может выдать ошибку, если attendance
не является строкой, представляющей целое число.Я предлагаю изменить сигнатуру метода, чтобы требовать правильные типы, а затем проверить и преобразовать их перед вызовом execution
.Это позволит избежать ошибок преобразования типов в этом методе.Таким образом, если вы получаете здесь ошибку, вы знаете, что она связана с взаимодействием с БД, а не с неправильной настройкой команды.