【问题标题】:How to avoid T-SQL error: conversion from type DBNull to type String is not valid如何避免 T-SQL 错误:从 DBNull 类型到 String 类型的转换无效
【发布时间】:2016-09-16 22:59:53
【问题描述】:

我使用以下 T-SQL 将数据插入到由 C# 构建的应用程序中,有些记录可以正常工作,但有些记录会出现以下错误。

INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
    SELECT
        [itemId], [suplId], [suplProdCode]  
    FROM 
        [table 28]   
    WHERE  
        [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);

有关调用即时的详细信息,请参阅此消息的末尾 (JIT) 调试而不是此对话框。

************** 异常文本 ************** System.InvalidCastException:从类型“DBNull”转换为类型 “字符串”无效。在 Microsoft.VisualBasic.CompilerServices.Conversions.ToString(对象 值)在 MISys.Client.MIUltraDataGrid.MIUltraDataGrid.MIUltraDataGrid_InitializeRow(对象 发件人,InitializeRowEventArgs e) 在 Infragistics.Win.UltraWinGrid.InitializeRowEventHandler.Invoke(对象 发件人,InitializeRowEventArgs e) 在 Infragistics.Win.UltraWinGrid.UltraGrid.OnInitializeRow(InitializeRowEventArgs 吃 Infragistics.Win.UltraWinGrid.UltraGrid.FireEvent(GridEventIds id, EventArgs e) 在 Infragistics.Win.UltraWinGrid.UltraGrid.FireInitializeRow(InitializeRowEventArgs 吃 Infragistics.Win.UltraWinGrid.UltraGridRow.FireInitializeRow() 在 Infragistics.Win.UltraWinGrid.RowsCollection.FireInitializeRow(IList 行)在 Infragistics.Win.UltraWinGrid.RowsCollection.InitNonGroupByRows(IList fireInitializeRowOnTheseRows) 在 Infragistics.Win.UltraWinGrid.RowsCollection.SyncRowsHelper(IList 绑定列表)在 Infragistics.Win.UltraWinGrid.RowsCollection.SyncRows() 在 Infragistics.Win.UltraWinGrid.RowsCollection.EnsureNotDirty() 在 Infragistics.Win.UltraWinGrid.RowsCollection.GetEnumerator() 在 MISys.Client.MIUltraDataGrid.MIUltraDataGrid.RefreshGrid() 在 MISysForms.MIDetailsTemplate.RefreshGrids(控制 myparent)在 MISysForms.MIDetailsTemplate.RefreshGrids(控制 myparent)在 MISysForms.MIDetailsTemplate.RefreshGrids(控制 myparent)在 MISysForms.MIDetailsTemplate.RefreshGrids(控制 myparent)在 MISysForms.MIDetailsTemplate.RecordChanged() 在 MISysForms.MIItemDetails.RecordChanged() 在 MISysForms.MIDetailsTemplate.GetPreviousRecord() 在 MISysForms.MIDetailsTemplate.UltraToolbarsManager1_ToolClick(对象 发件人,ToolClickEventArgs e) 在 Infragistics.Win.UltraWinToolbars.UltraToolbarsManager.OnToolClick(ToolClickEventArgs 吃 ....

【问题讨论】:

  • 分享你正在使用的实际代码怎么样?
  • 如果您点击详细信息,它是否会更具体地告诉您该错误来自何处?
  • @TimFreese 是的,我在我的问题底部添加
  • 这就是问题所在。您发布了一条 dotnet 错误消息,您向我们展示的唯一代码是查询。您无法从 sql 中获取该错误消息。如果您想真正有机会找到解决方案,您需要向我们展示 dotnet 代码。
  • @SeanLange 抱歉,我无权访问 .Net 部分

标签: c# sql-server sql-server-2008 tsql dbnull


【解决方案1】:

例如,如果值不为空,请询问您的数据行,然后您可以将其正确转换:

object Value = dataRow[columnName];
if (Value != DBNull.Value)

【讨论】:

    【解决方案2】:

    您可以使用上述答案,或者如果您无权访问代码,请将您的 SELECT 更改为插入空白而不是 null,假设您有一个 SQL Server

    INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
    SELECT
        IsNull([itemId],''), IsNUll([suplId], ''), ISNull([suplProdCode],'')  
    FROM 
        [table 28]   
    WHERE  
        [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);
    

    【讨论】:

      【解决方案3】:

      您的列之一返回 NULL 值,如堆栈跟踪所示,调用 ToString() 函数会引发该错误。您可以使用 TSQL、ISNULL 函数重写您的 SELECT 语句。

      INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
      SELECT
          [itemId], [suplId], ISNULL([suplProdCode],'') as suplProdCode
      FROM 
          [table 28]   
      WHERE  
          [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);
      

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2015-06-07
        • 1970-01-01
        相关资源
        最近更新 更多