Ошибка: преобразование типа данных varchar в тип данных smalldatetime привело к значению вне допустимого диапазона - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь вставить данные в таблицу SQL Server из C#, которая является значением smalldatetime. В таблице я могу видеть данные в формате 2013-10-24 00: 00: 00.

В своем коде я делаю ниже, чтобы проверить, имеют ли данные, доступные в dataTable, правильный формат даты и времени, прежде чем данные будут вставлены. В Excel строка, содержащая строку (значение даты), может быть любого из форматов, которые я поместил в массив форматов. В Excel данные представлены в виде строки.

DateTime date;
bool isValidBookedDate = true;

string[] formats = { "yyyyddMM", "dd/MM/yyyy", "dd/mm/yyyy","yyyyddmm" ,                        
                     "dd-MMM-yy", "yyyyMMdd", "dd-mmm-yy", "yyyymmdd" ,
                     "dd/MM/yyyy hh:mm:ss", "yyyy-MM-dd" };

foreach (DataRow dtrow in excelDataSet.Tables[0].Rows)
{
    if (DateTime.TryParseExact(dtrow[5].ToString().Trim(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None,out date)) 
    {
        isValidBookedDate = true;
    }
    else
    {
        isValidBookedDate = false;
        break;
    }
}

if(isValidBookedDate)
{
    // SQL Server insert 
}

Когда данные передаются в операторе SQL Server Insert into, я получаю сообщение об ошибке

Преобразование типа данных varchar в тип данных smalldatetime привело к значению вне диапазона

Как это исправить? Спасибо

Обновлен код 1:

string[] formats = { "dd/MM/yyyy hh:mm:ss" };
  if (DateTime.TryParseExact(row[5].ToString(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
   {
 row[5] = Convert.ToDateTime(date.ToString("{MM/dd/yyyy hh:mm:ss}"));   // this line did not work
}

1 Ответ

1 голос
/ 05 апреля 2020

Позволяет иметь таблицу, называемую критериями, с такими полями: идентификатор, имя, ранг, описание, удалено, вставлено, зарегистрировано-пользователем, обновлено, обновлено-пользователем, использовано)

    if (DateTime.TryParseExact(dtrow[5].ToString().Trim(), formats, System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None,out Mydate)) 
:
:
string insertDate =  (Mydate.Year() + MyDate.Month() + MyDate.Day()
string strSQL = "insert into criteria values (16777214,'new name',1,'new name description',0,'" + insertDate + "',1,'17600101',0,1)"

Больше работы, но лучше пользователю запрос параметров. Здесь я использую OLEDB

string[] ParamName = new string[1]; // can be more then one
object[] ParamValue = new object[1];
ParamName[0] = "Inserted" ;
ParamValue[0] = insertDate ; // will insert you date into inserted - simple format yyyyMMdd 
ParamName[1] = "updated" ; 
ParamValue[1] = DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss"); // will insert current date into updated as complete date
strSQL = "insert into criteria values( 16777213, 'New name',1,'New name description',0,?,1,?,0,1)";

string res = InsertSQL(strSQL, ParamName, ParamValue);


public string InsertSQL(string strSql, string[] ParamName, Object[] ParamValue) 
                {
                    try
                    {
                        OleDbCommand cmd = new OleDbCommand(strSql, sqlConn);
                        for (int i = 0; i < ParamName.Length; i++)
                        {
                            if (ParamName[i] != "")
                            {
                                cmd.Parameters.AddWithValue(ParamName[i], ParamValue[i]);
                            }
                        }
                        cmd.ExecuteNonQuery();
                        return "OK";
                    }
                    catch (Exception e)
                    {
                        Debug.Print(e.Message);
                        return e.HResult.ToString(); 
                    }
                }

И, пожалуйста, проверьте нижний регистр - верхний регистр в моем примере - я написал это здесь, в Stackoverflow, а не в visual studio - так что в моем примере может быть небольшая ошибка. Это не решит проблему, заключающуюся в том, что tryParse может выдавать неправильное значение, потому что он делает то, что говорит имя: он пытается проанализировать некоторую строку до допустимой даты. Может быть, это должен быть другой случай. Так что этот ответ относится только к вашей ошибке преобразования в коде вставки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...