C# 将DBNull替换为null
我目前正在从事一个使用MS SQL Server的C#WPF项目 由于使用DBNull值有点烦人,我想知道是否有可能以某种方式将这些值转换为常规的c#null值 我编写了一个小包装器来连接数据库,执行SELECT语句并将结果作为DataTable返回:C# 将DBNull替换为null,c#,sql,sql-server,dbnull,C#,Sql,Sql Server,Dbnull,我目前正在从事一个使用MS SQL Server的C#WPF项目 由于使用DBNull值有点烦人,我想知道是否有可能以某种方式将这些值转换为常规的c#null值 我编写了一个小包装器来连接数据库,执行SELECT语句并将结果作为DataTable返回: public static DataTable getResultTable(string select, params DbParameter[] parameters) { using (OleDbConnection connect
public static DataTable getResultTable(string select, params DbParameter[] parameters) {
using (OleDbConnection connection = new OleDbConnection(_connectionString)) {
connection.Open();
try {
using (OleDbCommand cmd = new OleDbCommand(select, connection)) {
for (int i = 0; i < parameters.Length; i++) {
cmd.Parameters.Add("?", parameters[i].type).Value = parameters[i].value;
}
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) {
using (DataTable dt = new DataTable()) {
adapter.Fill(dt);
//Here my DataTable dt is filled with the required data
//I´d like to replace all DBNull Values with regular null values now
return dt;
}
}
}
} finally {
connection.Close();
}
}
}
公共静态数据表getResultTable(字符串选择,参数DbParameter[]参数){
使用(OLEDB连接=新OLEDB连接(_connectionString)){
connection.Open();
试一试{
使用(OleDbCommand cmd=新OleDbCommand(选择,连接)){
对于(int i=0;ipublic static class ExtensionMethods {
public static T? GetValue<T>(this DataRow row, string columnName) where T : struct {
if (row[columnName] is T)
return (T)row[columnName];
return null;
}
public static T GetValue<T>(this DataRow row, string columnName, T defaultValue) {
return (row[columnName] is T) ? (T)row[columnName] : defaultValue;
}
}
公共静态类扩展方法{
公共静态T?GetValue(此DataRow行,字符串columnName),其中T:struct{
如果(行[columnName]为T)
返回(T)行[列名称];
返回null;
}
公共静态T GetValue(此DataRow行、字符串columnName、T defaultValue){
返回(行[columnName]为T)?(T)行[columnName]:默认值;
}
}
- 第一种方法仅将T参数限制为
,这 这意味着您在这里只能使用值类型(int、bool、double等),但是 没有对象类型(字符串、自定义对象等) 然后它将返回给定类型的struct
版本(例如Nullable
对于int?
),如果值为int
,则将为DBNull
null
- 第二种方法可用于值类型和对象类型。
这里您还必须给出一个默认值,该值将被返回
当vlaue为
时。 此方法还可用于将DBNull
更改为DBNull
,但仅适用于对象类型,因为这些类型始终可以设置为null
,并且 不需要特殊的null
可为空的
public static class ExtensionMethods
{
public static T GetValue<T>(this DataRow row, string columnName, T defaultValue = default(T))
{
var obj = row[columnName];
// if obj is DbNull it will skip this and return the default value
if (obj is T)
{
return (T)obj;
}
return defaultValue;
}
}
公共静态类扩展方法
{
公共静态T GetValue(此DataRow行,字符串columnName,T defaultValue=default(T))
{
var obj=行[列名称];
//如果obj为DbNull,它将跳过此操作并返回默认值
if(obj是T)
{
返回(T)obj;
}
返回默认值;
}
}
你可以这样使用它
var dt = getResultTable(...);
var value1 = dt.Rows[0].GetValue<int>("ColumnName");
var value2 = dt.Rows[0].GetValue<int>("ColumnName", 10); // you can also specify a different default value if needed
var dt=getresultable(…);
var value1=dt.Rows[0].GetValue(“ColumnName”);
var value2=dt.Rows[0]。GetValue(“ColumnName”,10);//如果需要,还可以指定不同的默认值
扩展方法使您能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被调用时就好像它们是扩展类型上的实例方法一样
public static class ExtensionMethods
{
public static T GetValue<T>(this DataRow row, string columnName, T defaultValue = default(T))
{
var obj = row[columnName];
// if obj is DbNull it will skip this and return the default value
if (obj is T)
{
return (T)obj;
}
return defaultValue;
}
}
公共静态类扩展方法
{
公共静态T GetValue(此DataRow行,字符串columnName,T defaultValue=default(T))
{
var obj=行[列名称];
//如果obj为DbNull,它将跳过此操作并返回默认值
if(obj是T)
{
返回(T)obj;
}
返回默认值;
}
}
你可以这样使用它
var dt = getResultTable(...);
var value1 = dt.Rows[0].GetValue<int>("ColumnName");
var value2 = dt.Rows[0].GetValue<int>("ColumnName", 10); // you can also specify a different default value if needed
var dt=getresultable(…);
var value1=dt.Rows[0].GetValue(“ColumnName”);
var value2=dt.Rows[0]。GetValue(“ColumnName”,10);//如果需要,还可以指定不同的默认值
您真的需要更换吗?更好的方法是不替换。@jdweng不,我不需要替换,但是使用null更舒服,因为你可以使用像?
这样的操作符。你为什么要替换它?只需使用DBNull
而不是?
您会使用==DBNull吗?null:value
我很好奇为什么要使用OleDb与SQL Server对话,而不是System.Data.SqlClient;后者更为有效。考虑迁移到更现代的数据访问机制(如Dappor或实体框架)。如果您不再使用直接的System.Data,那么DbNull问题将基本上消失。另外,由于您使用的是连接,因此不需要try/finally/close-使用的Dispose
调用将关闭连接。您真的需要替换吗?更好的方法是不替换。@jdweng不,我不需要替换,但是使用null更舒服,因为你可以使用像?
这样的操作符。你为什么要替换它?只需使用DBNull
而不是?
您会使用==DBNull吗?null:value
我很好奇为什么要使用OleDb与SQL Server对话,而不是System.Data.SqlClient;拉特