Member 14914355 Ответов: 3

У меня есть проблема с хранимой процедурой


привет джентльмены это мой код
это дало мне ошибку в том, что

ID = конвертировать.ToInt32(cmd.ExecuteScalar());
System.Data.SqlClient.SqlException: 'ошибка преобразования типа данных nvarchar в date.'

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

protected void btnSubmit_Click(object sender, EventArgs e)
{
    int ID = 0;
    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand("1400-88"))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@FROM", txtStartDate.Text.Trim());
                cmd.Parameters.AddWithValue("@TO", txtEndDate.Text.Trim());
                cmd.Parameters.AddWithValue("@TYPE_ASSESSMENT", DropDownList1.Text.Trim());
                cmd.Parameters.AddWithValue("@BASE_WING", DropDownList20.Text.Trim());
                cmd.Parameters.AddWithValue("@SQUADRON", DropDownList3.Text.Trim());
                cmd.Parameters.AddWithValue("@FLIGHT_STAFF", DropDownList4.Text.Trim());
                cmd.Parameters.AddWithValue("@BRANCH", DropDownList5.Text.Trim());
                cmd.Parameters.AddWithValue("@WORK_CENTER", DropDownList6.Text.Trim());
                cmd.Parameters.AddWithValue("@REPEAT", DropDownList7.Text.Trim());
                cmd.Parameters.AddWithValue("@MAJOR", DropDownList8.Text.Trim());
                cmd.Parameters.AddWithValue("@SAFETY", DropDownList9.Text.Trim());
                cmd.Parameters.AddWithValue("@MINOR", DropDownList10.Text.Trim());
                cmd.Parameters.AddWithValue("@SPECIAL", DropDownList11.Text.Trim());
                cmd.Parameters.AddWithValue("@AQLA", DropDownList12.Text.Trim());
                cmd.Parameters.AddWithValue("@OTHER", DropDownList13.Text.Trim());
                cmd.Parameters.AddWithValue("@REPORT_CONTROL", TextBox6.Text.Trim());
                cmd.Parameters.AddWithValue("@OBSERVATION", TextBox2.Text.Trim());
                cmd.Parameters.AddWithValue("@REFERENCE", TextBox5.Text.Trim());
                cmd.Parameters.AddWithValue("@MOST_PROBABLE_CAUSE", DropDownList15.Text.Trim());
                cmd.Parameters.AddWithValue("@REFERENCE_AS_APPROPERIATE", TextBox3.Text.Trim());
                cmd.Parameters.AddWithValue("@RECOMMANDED_CORRECTIVE_ACTION", DropDownList17.Text.Trim());
                cmd.Parameters.AddWithValue("@QMA_CHECKLIST_TASK", drbTaskList.Text.Trim());
                cmd.Parameters.AddWithValue("@INSPECTOR_INFO", DropDownList18.Text.Trim());
                cmd.Parameters.AddWithValue("@INTERVAL", DropDownList19.Text.Trim());
                cmd.Parameters.AddWithValue("@CORRECTIVE_ACTION", TextBox7.Text.Trim());
                cmd.Parameters.AddWithValue("@OPR", DropDownList21.Text.Trim());
                cmd.Parameters.AddWithValue("@CORRECTED_BY", TextBox9.Text.Trim());
                cmd.Parameters.AddWithValue("@DATE_CORRECTED", TextBox8.Text.Trim());
                cmd.Connection = con;
                con.Open();
                ID = Convert.ToInt32(cmd.ExecuteScalar());
                con.Close();
            }

Sandeep Mewara

Ошибка исходит из вашего stroed proc, где у вас есть некоторые данные преобразования на месте. Вы не поделились тем, что так трудно было бы точно указать линию.
Вторая мысль - учитывая ошибку, она должна быть в основном решена в самой стороне C# (с кодом, которым вы поделились), поэтому мы поделимся тем, как ее решить.

Jin Vincent Necesario

Я считаю, что когда вы сталкиваетесь с ошибкой: "ошибка преобразования типа данных varchar в дату", вы передали строку, которая не может быть проанализирована в дату. Другими словами, вам нужно проверить, правильно ли вы отформатировали дату. Вы можете проверить следующее: @DATE_CORRECTED, @FROM и @TO.

3 Ответов

Рейтинг:
1

Richard Deeming

Одно из значений, которое вы передаете, не является допустимым представлением даты.

Мы не можем сказать вам, какой именно, потому что это зависит от значений в ваших элементах управления, которые мы не можем видеть, и типов параметров ваших хранимых процедур, которые мы также не можем видеть.

Воспользуйся значение datetime.Метод tryparse[^] чтобы попытаться проанализировать необходимые значения в виде дат, прежде чем передавать их в AddWithValue.


Рейтинг:
1

Sandeep Mewara

Ссылка: Класс SqlException (System.Data.SqlClient) | Microsoft Docs[^]

Цитата:
Исключение, которое возникает, когда SQL Server возвращает предупреждение или ошибку. Этот класс не может быть унаследован.


Ошибка была вызвана из базы данных SQL, в основном из-за выполнения некоторых запросов в вашей хранимой процедуре.

Теперь есть два способа решить эту проблему:
1. Передать право данных из C# себя СП
2. Проверьте, что передаваемые данные являются допустимым значением, которое вы можете преобразовать в SP


Член 14914355 написал:
"Ошибка преобразования типа данных nvarchar в дату".

Скорее всего, либо ваша дата, переданная в виде строки, пуста, либо содержит некоторые недопустимые символы, которые не могут быть преобразованы в формат даты. Я бы предложил преобразовать его в Datetime в C# с помощью Преобразовать.Объект todatetime[^] или значение datetime.Разбор[^] все, что вам подходит, а затем передайте его.

Попробуй и увидишь.

ОБНОВЛЕНИЕ:
Кстати, вы также можете решить эту проблему в хранимой процедуре, если ошибка связана только с форматом даты, а ваш конверт использует какое-то другое значение формата.
Ссылка:
Преобразование даты и времени с помощью SQL Server[^]
Приведение и преобразование (Transact-SQL) - SQL Server | Microsoft Docs[^]


Рейтинг:
1

Member 14914355

ИЗВИНИТЕ ЧТО ПРЕРЫВАЮ ЭТУ ХРАНИМУЮ ПРОЦЕДУРУ

CREATE PROCEDURE [dbo].[1400-88]
	@FROM DATE ,
	@TO DATE ,
	@TYPE_ASSESSMENT NVARCHAR(50),
	@BASE_WING NVARCHAR(50),
	@SQUADRON NVARCHAR(50),
	@FLIGHT_STAFF NVARCHAR(50),
	@BRANCH NVARCHAR(50),
	@WORK_CENTER NVARCHAR(50),
	@REPEAT NVARCHAR(50),
	@MAJOR NVARCHAR(50),
	@SAFETY NVARCHAR(50),
	@MINOR NVARCHAR(50),
	@SPECIAL NVARCHAR(50),
	@AQLA NVARCHAR(50),
	@OTHER NVARCHAR(50),
	@REPORT_CONTROL NVARCHAR(50),
    @OBSERVATION NVARCHAR(50),
    @REFERENCE NVARCHAR(50),
    @MOST_PROBABLE_CAUSE NVARCHAR(50),
    @REFERENCE_AS_APPROPERIATE NVARCHAR(50),
    @RECOMMANDED_CORRECTIVE_ACTION NVARCHAR(50),
    @QMA_CHECKLIST_TASK# NVARCHAR(50),
    @INSPECTOR_INFO NVARCHAR(50),
    @INTERVAL NVARCHAR(50),
	@CORRECTIVE_ACTION NVARCHAR(500),
	@OPR NVARCHAR(10),
	@CORRECTED_BY NVARCHAR(20),
	@DATE_CORRECTED DATETIME

AS
BEGIN
		INSERT INTO [1400-88-QAR]
	([DATE FROM]
	,[DATE TO]
	,[TYPE ASSESSMENT]
    ,[BASE-WING]
	,[SQUADRON]
	,[FLIGHT/STAFF]
	,[BRANCH]
	,[WORKCENTER]
	,[REPEAT]
	,[MAJOR]
	,[SAFETY]
	,[MINOR]
	,[SPECIAL]
	,[AQLA]
	,[OTHER]
	,[REPORT CONTROL #]
    ,[OBSERVATION]
    ,[REFERENCE]
    ,[MOST PROBABLE CAUSE]
    ,[REFERENCE (as APPROPERIATE)]
    ,[RECOMMENDED CORRECIVE ACTION]
    ,[QMA CHECKLIST TASK #]
    ,[INSPECTOR INFO]
    ,[INTERVAL]
	,[CORRECTIVE_ACTION]
	,[OPR]
	,[CORRECTED_BY]
	,[DATE_CORRECTED])
		VALUES
	(@FROM
	,@TO
	,@TYPE_ASSESSMENT
	,@BASE_WING
	,@SQUADRON
	,@FLIGHT_STAFF
	,@BRANCH
	,@WORK_CENTER
	,@REPEAT
	,@MAJOR
	,@SAFETY
	,@MINOR
	,@SPECIAL
	,@AQLA
	,@OTHER
	,@REPORT_CONTROL
    ,@OBSERVATION
    ,@REFERENCE
    ,@MOST_PROBABLE_CAUSE
    ,@REFERENCE_AS_APPROPERIATE
    ,@RECOMMANDED_CORRECTIVE_ACTION
    ,@QMA_CHECKLIST_TASK#
    ,@INSPECTOR_INFO
    ,@INTERVAL
	,@CORRECTIVE_ACTION
	,@OPR
	,@CORRECTED_BY
	,@DATE_CORRECTED)
		
		SELECT SCOPE_IDENTITY() -- 1400-88	   
    
END


Patrice T

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