Я думаю, что Белоусов Павел прав.Внутри каждого foreach вы назначаете каждый элемент словаря в качестве параметра.Каждый из этих параметров определяется как VarChar.С учетом предоставленной информации логично предположить, что проблема заключается в хранимой процедуре.
Можно ли опубликовать код хранимой процедуры или попытаться воссоздать ошибку в SQL Management Studio, выполнив хранимую процедуру там.
ОБНОВЛЕНИЕ ...
После просмотра вашей хранимой процедуры код выглядит правильно.Я смог сгенерировать сообщение об ошибке, которое вы получаете, используя следующий код sql.
Declare @ col3 varchar (50)
set @ col3 = '| 3/11/2010'
объявите @temp datetime
set @temp = (выберите convert (datetime, @ col3))
Обратите внимание, что значение @ col3 начинается с символа канала.Если вы удалите символ канала, он будет работать правильно.
Я бы посмотрел поближе на значения в словаре, из которого вы получаете значения параметров.Возможно, проблема связана с тем, как вы анализировали данные.
ОБНОВЛЕНИЕ 2
Код, приведенный ниже, не подтвержден, но я думаю, что вижу, что вы пытаетесьсделать.Я предполагаю, что в передаваемой вами таблице данных есть такие данные:
col1 | col2 | col3 11 | A2 | 1/10/1978 12 | b2 | 2/10/1978 13 | c2 | 3/10 /1978 14 | d2 | 4/10/1978
Если это так, нам не нужен словарь, который был передан изначально.Я также могу предположить, что вы хотите, чтобы хранимая процедура выполнялась один раз для каждой строки в DataTable.Приведенный ниже метод аналогичен тому, что вы делали, хотя он выполняет хранимую процедуру для каждой строки.
Я не уверен из вашего объяснения, что первая строка таблицы данных содержит имена столбцов, еслине беспокойтесь тогда.Надеюсь, что это имеет смысл, оставляйте больше комментариев, если у вас есть вопросы.
public static string TestMethod(DataTable dt)
{
string connString = "";
string errorMsg = string.Empty;
try
{
//loop through each row of the datatable. Not sure if the column names is a row.
foreach (DataRow row in dt.Rows)
{
using (SqlConnection conn2 = new SqlConnection(connString))
{
using (SqlCommand cmd = conn2.CreateCommand())
{
cmd.CommandText = "dbo.AppendDataCT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col1", SqlDbType = SqlDbType.VarChar, Value = row[0] });
cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col2", SqlDbType = SqlDbType.VarChar, Value = row[1] });
cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col3", SqlDbType = SqlDbType.VarChar, Value = row[2] });
conn2.Open();
cmd.ExecuteNonQuery();
conn2.Close();
}
}
}
errorMsg = "The Person.ContactType table was successfully updated!";
}
catch
{
}
return errorMsg;
}