Muhammd Aamir Ответов: 2

Ошибка: преобразование типа данных varchar в date


Всем Привет..
пожалуйста, помогите мне в моем проекте. у меня есть создать процедуру, которую я вызываю к ней в моем файле aspx.cs ниже приводится краткое изложение моего кода.

Что я уже пробовал:

Вот моя хранимая процедура:

CREATE PROCEDURE PLACE_DEMAND
(
@ITEM_ID INT,
@EMP_ID INT,
@DEMAND_DATE DATE,
@DEMAND_QUANTITY INT,
@DEMAND_STATUS VARCHAR (50),
@STATUS_DATE DATE
)
AS
BEGIN
INSERT INTO Demands (Item_ID,Emp_ID,Demand_Date,Demand_Quantity,Demand_Status,Status_Date) VALUES (@ITEM_ID,@EMP_ID,@DEMAND_DATE,@DEMAND_QUANTITY,@DEMAND_STATUS,@STATUS_DATE)
END



И ниже моя функция, которая выполняет мою процедуру:

public static void exec_insert_proc(string proc, string[] param)
 {
     SqlCommand cmd = new SqlCommand(proc, DBConnection());
     cmd.CommandType = CommandType.StoredProcedure;
     int i;
     for (i = 0; i <= param.Length - 1; i++)
     {
         string[] nme;
         nme = param[i].Split(':');
         cmd.Parameters.Add(nme [0], SqlDbType.VarChar, 50).Value = nme [1];
     }
     cmd.ExecuteNonQuery(); // error occured here which is Error converting data type varchar to date
 }


И наконец это моя функция, которой я передаю параметры

string abc = Convert.ToString(DateTime.Now);
 string[] array = new string[]
 {
"@ITEM_ID:"+DDL_Select_Item.SelectedValue,"@EMP_ID:"+txt_Emp_ID.Text,"@DEMAND_DATE:"+txt_Date.Text,"@DEMAND_QUANTITY:"+txt_Quantity.Text,"@DEMAND_STATUS:"+txt_Status.Text,"@STATUS_DATE:"+abc 
};
 db.exec_insert_proc("dbo.PLACE_DEMAND", array);

2 Ответов

Рейтинг:
5

Kornfeld Eliyahu Peter

Вы совершаете большую ошибку-дважды...
Прежде всего, вы передаете двоичные значения в виде строки, что всегда является проблемой...
Просто подумайте о том, сколько способов дата может быть представлена в виде строки...
Вторая ошибка заключается в преобразовании всего в строку и передаче всего как строки. Вы можете быть удивлены, но SQL может обрабатывать нестроковые значения, и классы в библиотеке .NET SQL тоже могут их обрабатывать...
Так что сделайте себе одолжение и передайте каждое значение в соответствии с типом...

Вы можете создать общую функцию, которая получает массив объектов и сопоставляет их реальный тип с типами SQL, если это необходимо...


Muhammd Aamir

спасибо Корнфельд Элияху Питер что мне нужно будет сделать чтобы передать каждое значение в соответствии с типом пожалуйста любезно покажите мне какой нибудь код

Kornfeld Eliyahu Peter

У вас есть эта линия:
УМК.Параметры.Add (nme [0], SqlDbType. VarChar, 50). Value = nme [1];
измените SqlDbType. VarChar в соответствии с реальным типом объекта (некоторый switch-case)...

Muhammd Aamir

Хорошо, большое вам спасибо... хорошего вам дня

Рейтинг:
13

OriginalGriff

Просто: передавайте значения DateTime как DateTime из вашего кода C# в SQL, а не как строковое значение.
Когда вы передаете строку в SQL и ожидаете, что она будет вставлена ​​в столбец DATE, SQL будет использовать настройки datetime своего сервера для ее преобразования, а не настройки вашего клиента или даже вашего веб-сервера. Поэтому, если я введу сегодняшнюю дату как «21/12/16», это будет иметь для меня смысл: «21-й день, 12-й месяц, 2016». Но если сервер SQL настроен на локаль Windows по умолчанию, он ожидает, что это будет «21-й месяц, 12-й день, 2016» или в формате ISO как «2021, 12-й месяц, 16-й день» - и это может начать вызывать ошибки преобразования, некоторые из них вызовут ошибку, которую вы заметили, потому что это недопустимая дата. Кроме того, если пользователь неправильно введет значение, преобразование также не будет выполнено.

Преобразуйте ваши строки в "естественные" типы данных как можно скорее: целочисленные значения в int даты в datetime с помощью TryParse и пользователь культуры и сообщать о проблемах непосредственно ему, а не отправлять данные в SQL. Затем передайте эти значения как собственные типы данных в SQL, чтобы дальнейшее преобразование не требовалось. Таким образом, вы поймаете проблемы на ранней стадии, чтобы их можно было решить вместо того, чтобы вставлять неверные данные в вашу БД и вызывать массовые проблемы, чтобы разобраться с ними позже, когда вы заметите несоответствия.


Muhammd Aamir

Оригинальное Спасибо, Сэр... Теперь я назначил дату и время не из кода c#, а из функции sql GETDATE (), и это отлично работает для меня