如何测试任何数据类型的DBNull?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试任何数据类型的DBNull?相关的知识,希望对你有一定的参考价值。

我已经在网上浏览了几天,似乎找不到我的错误的出路。在我的代码中,有一个方法调用我的Get_Data来执行简单的选择并填充wpf datagrid。现在我面临的问题是,执行该方法时,它将为DBNull引发错误。该表允许某些列具有空值。

表格:

[WorkId]         INT           IDENTITY (100, 1) NOT NULL,
[fk_CustId]      INT           NULL,
[CustPartNum]    NVARCHAR (25) NULL,
[QtyPieces]      INT           NOT NULL,
[WoDateCreated]  DATETIME      DEFAULT (getdate()) NULL,
[WoDeliverDate]  DATETIME      NOT NULL,
[WoCompleted]    BIT           NULL,
[WoCompleteDate] DATETIME      NULL,
PRIMARY KEY CLUSTERED ([WorkId] ASC),
FOREIGN KEY ([fk_CustId]) REFERENCES [dbo].[Customers] ([CustId])

clsDB:

public static SqlConnection DB_Connect()
    {
        // Created connection to local DB
        string cn_String = Properties.Settings.Default.ShopSystemConnectionString;
        SqlConnection cn_Connect = new SqlConnection(cn_String);
        if (cn_Connect.State != ConnectionState.Open) cn_Connect.Open();

        return cn_Connect;
    }

public static DataTable Get_Data(string SQL_Text)
    {
        SqlConnection cn_Connect = DB_Connect();

        DataTable table = new DataTable();
        SqlDataAdapter adapter = new SqlDataAdapter(SQL_Text, cn_Connect);

        adapter.Fill(table);
        if (table.Rows.Count == 0)
        {
            MessageBox.Show("No record available for the selected line");
        }

        return table;
    }

错误:enter image description here

非常感谢任何帮助或建议

编辑1

XAML代码

<DataGrid x:Name="gridCustWO" Height="190" Canvas.Left="293" Width="734" FontSize="11" BorderThickness="1" Background="#FF725D55" IsReadOnly="True" AutoGenerateColumns="False" ItemsSource="{Binding WorkOrders}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding WorkId}" Width="Auto" Header="ID"/>
            <DataGridTextColumn Binding="{Binding CustPartNum}" Width="Auto" Header="Part Number"/>
            <DataGridTextColumn Binding="{Binding QtyPieces}" Width="Auto" Header="Qty Total"/>
            <DataGridTextColumn Binding="{Binding WoDateCreated}" Width="Auto" Header="Order Created"/>
            <DataGridTextColumn Binding="{Binding WoDeliverDate}" Width="Auto" Header="Shipped"/>
            <DataGridTextColumn Binding="{Binding WoCompleteDate}" Width="Auto" Header="WO Completed"/>
        </DataGrid.Columns>
    </DataGrid>
答案

[不是100%肯定会行得通,但我的假设是,通过使用DataGridTextColumns并绑定数据,它将尝试将它们转换为字符串,一种解决方法是将datagrid更改为:

<DataGrid x:Name="gridCustWO" Height="190" Canvas.Left="293" Width="734" FontSize="11" BorderThickness="1" Background="#FF725D55" IsReadOnly="True" AutoGenerateColumns="True" />

并以编程方式设置ItemsSource并隐藏任何列并更改标题,例如:

gridCustWO.ItemsSource = myDataTable.DefaultView;
// if you want to hide a column
gridCustWO.Columns[0].Visibility = Visibility.Hidden;

希望这会有所帮助!

以上是关于如何测试任何数据类型的DBNull?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Visual Basic 代码将对象从 DBNull 转换为其他类型

null 和System.DBNull.Value

[C#] 如何优雅的解决 DBNull 问题

[C#] 如何优雅的解决 DBNull 问题

C# 数据库访问:DBNull 与 null

对象不能从 DBNull 转换为 C# 中的其他类型