С# Как я могу обновить дату и время столбца в datagridview до базы данных

мне нужно обновить некоторые столбцы в datagridview до базы данных. но не обновлять базу данных.

шаг первый: я выбираю дату и время из datetimepicker.

шаг второй: показать дату и время в datagridview.

дерево шагов: мне нужно обновить/отредактировать datagridview в базе данных.

Отображать в Datagridview.

EmpNo     fName     ChkDate     ChkIn   ChkOut
00001     Al        01/10/2012  08:02   17:04
00002     Bik       01/10/2012  07:43   18:35

мне нужно обновить поля "ChkIn" в базе данных.

Код

SqlConnection Conn;
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da;
DataTable dt = new DataTable();
DataSet ds = new DataSet();
StringBuilder sb = new StringBuilder();


string appConn = ConfigurationManager.ConnectionStrings["connDB"].ConnectionString;

int i;

    for (i = 1; i < dgvShow.Rows.Count; i++)
    {
        if (dgvShow.Rows.Count > 0)
        {
            SqlConnection conn = new SqlConnection(appConn);
            string sql = "UPDATE [WebSP].[dbo].[filesTA]"
            + "SET [filesTA].ChkIn = replace(convert(nvarchar(10),'" + dgvShow.Rows[i].Cells[3].Value + "',102),'.',':')"
            + "FROM [WebSP].[dbo].[filesTA]"
            + "WHERE [filesTA].ChkDate = '" + dateTimePicker.Value.ToString("yyyy-MM-dd") + "' and [filesTA].EmpNo = '" + dgvShow.Rows[i].Cells[0].Value + "'";

            da = new SqlDataAdapter(sql, Conn);
            DataSet ds = new DataSet();
            da.Fill(ds);
            Conn.Close();

            dgvShow.DataSource = ds;
            da.Update(ds);
        }
    }

Ошибка: обновление не может найти TableMapping['Table'] или DataTable 'Table'.

Я пробую другой код:

Conn = new SqlConnection();
            if (Conn.State == ConnectionState.Open)
            {
                Conn.Close();
            }
            Conn.ConnectionString = appConn;
            Conn.Open();

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM [filesTA]", appConn);
            adapter.UpdateCommand = new SqlCommand("UPDATE [WebSP].[dbo].[filesTA]"
            + "SET [filesTA].ChkIn = replace(convert(nvarchar(10),@cIn,102),'.',':')"
            + "FROM [WebSP].[dbo].[filesTA]"
            + "WHERE [filesTA].ChkDate = @cDate and [filesTA].EmpNo = @eNo", Conn);

            adapter.UpdateCommand.Parameters.Add("@cIn", SqlDbType.NVarChar, 10, "ChkIn");
            adapter.UpdateCommand.Parameters.Add("@cDate", SqlDbType.NVarChar, 10, "ChkDate");
            adapter.UpdateCommand.Parameters.Add("@eNo", SqlDbType.NVarChar, 10, "EmpNo");

            DataSet ds = new DataSet();
            adapter.Fill(ds);

            dgvShow.DataSource = ds;
            adapter.Update(ds);

этот код не сохраняется в базе данных.

Спасибо за ваше время. :D

Тип базы данных:

Тип ChkIn и ChkDate DateTime,EmpNo Тип NUMERIC

Я пытаюсь

int i;
            for (i = 1; i < dgvShow.Rows.Count; i++)
            {
                if (dgvShow.Rows.Count > 0)
                {
                    using (Conn = new SqlConnection(appConn))
                    {
                        Conn.Open();

                        string sql = "UPDATE [WebSP].[dbo].[filesTA]" +
                                     "SET [filesTA].ChkIn = replace(convert(nvarchar(10),@cIn,102),'.',':')" +
                                     "FROM [WebSP].[dbo].[filesTA]" +
                                     "WHERE [filesTA].ChkDate = @cDate and [filesTA].EmpNo = @eNo";
                        SqlCommand cmd = new SqlCommand(sql, Conn);
                        cmd.Parameters.Add("@cIn", SqlDbType.DateTime, 10, "ChkIn").Value = Convert.ToDateTime(dgvShow.Rows[i].Cells[3].Value).ToString();
                        cmd.Parameters.Add("@cDate", SqlDbType.DateTime, 10, "ChkDate").Value = Convert.ToDateTime(dateTimePicker.Value.ToString()).ToString();
                        cmd.Parameters.Add("@eNo", SqlDbType.Decimal, 10, "EmpNo").Value = Convert.ToDecimal(dgvShow.Rows[i].Cells[0].Value).ToString();
                        cmd.ExecuteNonQuery();
                    }



                }
            }

Ошибка: Ошибка преобразования при преобразовании даты и/или времени из строки символов. Т__Т


person nettoon493    schedule 18.11.2012    source источник
comment
Пожалуйста, покажите значение строки sql во время ее компиляции.   -  person MVCKarl    schedule 18.11.2012


Ответы (1)


Вы можете попытаться избавиться от SqlDataAdapter, используя непосредственно SqlCommand

Using(Conn = new SqlConnection(appConn))
{
    Conn.Open();

    string sql = "UPDATE [WebSP].[dbo].[filesTA] " + 
                 "SET [filesTA].ChkIn = replace(convert(nvarchar(10),@cIn,102),'.',':') " + 
                 "FROM [WebSP].[dbo].[filesTA] " +
                 "WHERE [filesTA].ChkDate = @cDate and [filesTA].EmpNo = @eNo";
    SqlCommand cmd = new SqlCommand(sql, Conn);
    cmd.Parameters.Add("@cIn", SqlDbType.NVarChar, 10, "ChkIn").Value = 
                               dgvShow.Rows[i].Cells[3].Value;
    cmd.Parameters.Add("@cDate", SqlDbType.NVarChar, 10, "ChkDate").Value = 
                                 dateTimePicker.Value.ToString("yyyy-MM-dd") ;
    cmd.Parameters.Add("@eNo", SqlDbType.NVarChar, 10, "EmpNo").Value = 
                                 dgvShow.Rows[i].Cells[0].Value ;
    cmd.ExecuteNonQuery();
}

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

Однако я действительно плохо понимаю код для обновления поля ChkIn. Это поле (в соответствии с типом параметра) является nvarchar, тогда почему бы вам не попытаться отформатировать значение @cIn непосредственно в коде и избежать использования функций замены и преобразования Sql Server? Также 102 — это стиль даты. Он используется для форматирования выражений даты в виде строк с шаблоном yy.mm.dddd, но у вас есть строка, содержащая только информацию о времени.

Например

После вашего последнего редактирования - изменено на это

DateTime chkIN = Convert.ToDateTime(dgvShow.Rows[i].Cells[3].Value);
DateTime chkDate = Convert.ToDateTime(dateTimePicker.Value.ToString("yyyy-MM-dd"));
decimal empNo = Convert.ToDecimal(dgvShow.Rows[i].Cells[0].Value) ;


cmd.Parameters.Add("@cIn", SqlDbType.DateTime).Value = chkIN;
cmd.Parameters.Add("@cDate", SqlDbType.DateTime).Value = chkDate;
cmd.Parameters.Add("@eNo", SqlDbType.Decimal).Value = empNo;

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

person Steve    schedule 18.11.2012
comment
я пытаюсь ошибка: Преобразование не удалось при преобразовании даты и/или времени из строки символов. (я редактирую тему, смотрите в ТОПе) - person nettoon493; 18.11.2012
comment
Ответ обновлен. Теперь вы указываете другой тип для ваших столбцов в базе данных. Теперь передайте два datetime и десятичное число. Не пытайтесь преобразовать все в строки. - person Steve; 18.11.2012