Ошибка asp.net: «Ошибка преобразования при преобразовании символьной строки в тип данных smalldatetime» - PullRequest
0 голосов
/ 30 июня 2010

Я получаю сообщение об ошибке при попытке вызвать сохраненный процесс со своей страницы asp.net.

e.Message = "Преобразование не удалось, когда преобразование строки символов в Тип данных smalldatetime. "

Хранимая процедура вызывается:

Код asp.net, который вызывает хранимый процесс:

//Display search results in GridView; 
SqlConnection con = new SqlConnection(strConn); 
//string sqlItemSearch = "usp_Item_Search"; 
SqlCommand cmdItemSearch = new SqlCommand(sqlItemSearch, con); 
cmdItemSearch.CommandType = CommandType.StoredProcedure; 

cmdItemSearch.Parameters.Add(new SqlParameter("@Item_Num", SqlDbType.VarChar, 30)); 
cmdItemSearch.Parameters["@Item_Num"].Value = txtItemNumber.Text.Trim(); 

cmdItemSearch.Parameters.Add(new SqlParameter("@Search_Type", SqlDbType.Int)); 
cmdItemSearch.Parameters["@Search_Type"].Value = ddlSearchType.SelectedItem.Value; 

cmdItemSearch.Parameters.Add(new SqlParameter("@Vendor_Num", SqlDbType.VarChar, 10)); 
cmdItemSearch.Parameters["@Vendor_Num"].Value = txtVendorNumber.Text.Trim(); 

cmdItemSearch.Parameters.Add(new SqlParameter("@Search_User_ID", SqlDbType.Int)); 
cmdItemSearch.Parameters["@Search_User_ID"].Value = ddlSeachUser.SelectedItem.Value; 

if (!string.IsNullOrEmpty(txtStartDate.Text)) 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
} 
else 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime("01/01/1996"); 
} 

if (!string.IsNullOrEmpty(txtEndDate.Text)) 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim()); 
} 
else 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(DateTime.Now); 
} 
con.Open(); 

SqlDataAdapter ada = new SqlDataAdapter(cmdItemSearch); 
DataSet ds = new DataSet(); 
ada.Fill(ds); 

    gvSearchDetailResults.DataSource = ds; 
    gvSearchDetailResults.DataBind(); 
    pnlSearchResults.Visible = true; 

Есть идеи, что может вызвать ошибку?

Ответы [ 5 ]

2 голосов
/ 30 июня 2010

Проблема вызвана одной из следующих строк:

cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim());

или

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());

или

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime("01/01/1996");

Это может быть вызвано неверно введенными значениями или проблемами локали. Если вам не нужно выводить сообщения проверки, то вы можете использовать статическую функцию DateTime.TryParse () для анализа введенной даты и времени.

Я бы сделал это так:

DateTime date;
cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); // note this line was unnecessary duplicated 
if (!string.IsNullOrEmpty(txtStartDate.Text) && DateTime.TryParse(txtStartDate.Text.Trim(), out date)) 
    cmdItemSearch.Parameters["@StartDate"].Value = date; 
else 
    cmdItemSearch.Parameters["@StartDate"].Value = DateTime.MinValue; 
0 голосов
/ 30 июня 2010

попробуйте, пожалуйста.Например, значение textBox1.Text равно 20100101

DateTime newDateTime = new DateTime(Convert.ToInt32(textBox1.Text.Substring(0,4)),// Year
                                Convert.ToInt32(textBox1.Text.Substring(4,2)),// Month
                                Convert.ToInt32(textBox1.Text.Substring(6,2)))// Day

. Вы не можете создать newDateTime из TextBox как ваш код.Вы должны написать формат после вашего текста, как "ггггммдд".Но мой код является абсолютным решением.

0 голосов
/ 30 июня 2010

Какой параметр SQL должен быть маленьким временем? Я не вижу, чтобы что-то определялось как таковое.

0 голосов
/ 30 июня 2010

Если предположить, что параметры бывают datetime / smalldatetime (хотя вы упомянули datetime), а не varchar, то одним из значений будет <01 Jan 1900 или> 06 Jun 2079 на основании сообщения об ошибке.

0 голосов
/ 30 июня 2010

Я думаю, здесь будут строчки кода:

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());

А здесь:

cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim());

Проверьте значения, которые вводятся в эти два параметра, и убедитесь, что они являются действительными датами, которые вы пытаетесь преобразовать.

Convert.ToDateTime(somedatehere) вернет значение по умолчанию DateTime.MinValue, если получит нулевое значение, но неправильно отформатированное значение вызовет исключение.

...