对象引用未设置为将空值发送到sql表的对象的实例

时间:2014-04-25 20:38:34

标签: c# sql-server sql-server-2012

我收到此错误

  

对象引用未设置为对象的实例

尝试将空值发送到SQL Server数据库时。该列接受NULL个值。这是我表的代码

[id] [int] IDENTITY(1,1) NOT NULL,
[numeroreporte] [varchar](100) NULL,
[dias] [nvarchar](10) NULL,
[lugar] [nvarchar](max) NULL,
[workorder] [int] NULL,
[InOutHour] [nvarchar](30) NULL,
[overtime] [int] NULL,
[emergencia] [nvarchar](50) NULL,
[viaje] [nvarchar](50) NULL,
[almuerzo] [decimal](12, 2) NULL,
[peaje] [decimal](12, 2) NULL,
[otros] [decimal](12, 2) NULL,

这是我在c#中的代码:

public void datosReporte ( DataGridView dgv,  Label linkLB )
{
    sqlCOMM = new SqlCommand("InsertarDatosReporte", sqlCON);
    sqlCOMM.CommandType = System.Data.CommandType.StoredProcedure;

    sqlCOMM.Parameters.Add("@numeroreporte", System.Data.SqlDbType.NVarChar); 
    sqlCOMM.Parameters.Add("@sp_dias", System.Data.SqlDbType.NVarChar) ;
    sqlCOMM.Parameters.Add("@sp_lugar", System.Data.SqlDbType.NVarChar) ;
    sqlCOMM.Parameters.Add("@sp_workorder", System.Data.SqlDbType.VarChar) ;
    sqlCOMM.Parameters.Add("@sp_InOutHour", System.Data.SqlDbType.NVarChar) ;
    sqlCOMM.Parameters.Add("@sp_overtime", System.Data.SqlDbType.Int).ToString() ;
    sqlCOMM.Parameters.Add("@sp_emergencia", System.Data.SqlDbType.NVarChar) ;
    sqlCOMM.Parameters.Add("@sp_viaje", System.Data.SqlDbType.NVarChar) ;
    sqlCOMM.Parameters.Add("@sp_almuerzo", System.Data.SqlDbType.Decimal) ;
    sqlCOMM.Parameters.Add("@sp_peaje", System.Data.SqlDbType.Decimal) ;
    sqlCOMM.Parameters.Add("@sp_otros", System.Data.SqlDbType.Decimal);

    try
    {
        sqlCON.Open();

        foreach (DataGridViewRow row in dgv.Rows)
        {
            if (!row.IsNewRow)
            {  
                sqlCOMM.Parameters["@numeroreporte"].Value =linkLB.Text; 
                sqlCOMM.Parameters["@sp_dias"].Value = row.Cells[0].Value.ToString();
                sqlCOMM.Parameters["@sp_lugar"].Value = row.Cells[1].Value.ToString();
                sqlCOMM.Parameters["@sp_workorder"].Value = row.Cells[2].Value;
                sqlCOMM.Parameters["@sp_InOutHour"].Value = row.Cells[3].Value.ToString();
                sqlCOMM.Parameters["@sp_overtime"].Value = row.Cells[4].Value;
                sqlCOMM.Parameters["@sp_emergencia"].Value = row.Cells[5].Value.ToString();
                sqlCOMM.Parameters["@sp_viaje"].Value = row.Cells[6].Value.ToString();
                sqlCOMM.Parameters["@sp_almuerzo"].Value = row.Cells[7].Value;
                sqlCOMM.Parameters["@sp_peaje"].Value = row.Cells[8].Value;
                sqlCOMM.Parameters["@sp_otros"].Value = row.Cells[9].Value; 

                sqlCOMM.ExecuteNonQuery(); 
            }
        }
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        sqlCON.Close();
    }
} 

1 个答案:

答案 0 :(得分:1)

您收到的错误消息告诉我,您使用Value.ToString()的其中一个单元格实际上包含null。您无法在不存在的对象上调用ToString

一种解决方案是首先检查单元格Value,如果它null,则将DBNull.Value分配给参数的Value。一个更好的选择是简单地将网格绑定到DataTable,然后默认情况下空单元格将包含DBNull.Value。您只需使用数据适配器将DataTable中的所有更改一次性保存回数据库,因此不会出现循环。