Получение ошибки при попытке вставить GetDate () в базу данных - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь вставить сегодняшнюю дату и рекурсивно увеличивать дату. но я получаю сообщение об ошибке преобразования.

private void InsertTimesheetWeek(string timeSheetID)
{
    int row = GViewTimeSheet.Rows.Count;//get the row count
    int counter = 0;

    string[] txtDate = new string[row];// date column

    foreach (GridViewRow gRow in GViewTimeSheet.Rows)
    {

        txtDate[counter] = "GetDATE()+"+counter;

        counter++;
    }

    //Intializing sql statement
    string fields = "(TimeSheetID, Date)";
    string parm = "(@TimeSheetID, @Date)";
    string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm;

    SqlCommand comm = new SqlCommand();
    comm.CommandText = sqlStatement;//assing sql statement as command
    SqlConnection connection = DataAccess.getConnection();
    comm.Connection = connection;

    try
    {
        connection.Open();
        for (int i = 0; i < row; i++)
        {
            comm.Parameters.AddWithValue("@TimeSheetID", timeSheetID);
            comm.Parameters.AddWithValue("@Date", txtDate[i]);

            comm.ExecuteNonQuery();
            comm.Parameters.Clear();
        }

    }
    catch (Exception ex)
    {
        Utilities.LogError(ex);
        throw ex;
    }
    finally
    {
        if (connection.State == ConnectionState.Open)// if the connection opened then 
        {
            connection.Close();//just close the connection in any way
        }
    }
}

Почему это вызывает ошибку?

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

Я бы сделал две вещи:

1) переместить создание параметра из цикла - вам нужно создать его только один раз

2) не используйте метод AddWithValue, так как этот метод должен угадать тип данных - и он может иногда ошибаться

Так что используйте это:

// Intializing sql statement
string fields = "(TimeSheetID, Date)";
string parm = "(@TimeSheetID, @Date)";
string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm;

using(SqlConnection connection = DataAccess.getConnection())
using(SqlCommand comm = new SqlCommand(sqlStatement, connection))
{
   comm.Parameters.Add("@TimeSheetID", SqlDbType.VarChar, 50); // just guessing
   comm.Parameters.Add("@Date", SqlDbType.DateTime);

   try
   {
      connection.Open();

      for (int i = 0; i < row; i++)
      {
          comm.Parameters["@TimeSheetID"] = timeSheetID;
          comm.Parameters["@Date"] = txtDate[i];

          comm.ExecuteNonQuery();
      }

      connection.Close();
    }
    catch (Exception ex)
    {
        Utilities.LogError(ex);
        throw;
    }
}

Как уже отмечали другие, ваш синтаксис для

txtDate[counter] = "GetDATE()+"+counter;

тоже немного странно - что ты здесь пытаешься сделать ?? Что вы пытаетесь добавить - counter дней? Месяцы? Много лет? Секунды? `Не совсем понятно ....

Может быть, вы можете «переместить» эту логику в точку, в которой вы устанавливаете значение даты:

for (int i = 0; i < row; i++)
{
   comm.Parameters["@TimeSheetID"] = timeSheetID;
   comm.Parameters["@Date"] = DateTime.Today.AddDays(i);  // is that what you need?

   comm.ExecuteNonQuery();
}
2 голосов
/ 19 марта 2012

Попробуйте изменить это:

txtDate[counter] = "GetDATE()+"+counter;

На это:

txtDate[counter] = DateTime.Now.AddDays(counter);
2 голосов
/ 19 марта 2012

Ошибка вызвана передачей «GetDATE () + 1», «GetDATE () + 2» и т. Д. В качестве параметра, и SQL не может преобразовать это в дату.

Сделать датувычисления в коде перед отправкой в ​​SQL:

txtDate[counter] = DateTime.Now.AddDays(counter);

Подход, который вы выбрали, сработал бы, если бы вы строили оператор SQL как литерал для каждой строки.
ex: *

for (int i = 0; i < row; i++)
{
    string fields = "(TimeSheetID, Date)";
    string parm = String.Format"({0}, GetDATE() + {1})", timeSheetID, i);
    string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm;

    // ....

* NB Не используйте приведенный выше код - я предоставил его только в качестве примера.Всегда используйте параметры SQL, если это возможно.Параметры являются типобезопасными и снижают риск внедрения SQL-кода. Как: защитить от SQL-инъекций в ASP.NET

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