110,566
社区成员
发帖
与我相关
我的任务
分享
foreach (SqlParameter para in cmd.Parameters)
{
if ((para.Direction == ParameterDirection.Output || para.Direction == ParameterDirection.InputOutput) && para.Value == null)
para.Value = DBNull.Value;
}
另一种解决方案共后人参考
static void Main(string[] args)
{
CLS cls = new CLS
{
abc = null
};
using (SqlConnection sqlConnection = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
{
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("INSERT INTO TESTA (A,B) VALUES(@A,@B)", sqlConnection);
sqlCommand.Parameters.AddWithValue("A", 1);
sqlCommand.Parameters.AddWithValue("B", GetDBValue(cls?.abc));
sqlCommand.ExecuteNonQuery();
}
}
static public object GetDBValue(object obj)
{
return obj ?? DBNull.Value;
}
public class CLS
{
public int? abc;
}
实际ado.net的项目里,一般是会有通用动态创建SQL语句方法的,例如插入,如果参数为null,那该字段就直接不写入SQL语句,也不赋值,也就无所谓是不是要转换成dbnull public static object GetDBParam(object value)
{
if (value == null)
return DBNull.Value;
else
return value;
}
new SqlParameter("@Code", MyHelper.GetDBParam(report.Code))
[/quote]
如果你采用“扩展方法”技术,例如定义一个
public static object GetDBParam(this object value)
就是多写个 this,那么你就可以写new SqlParameter("@Code", report.Code.GetDBParam())
你已经为任意的 object 都添加了一个 GetDBParam 扩展方法。这才真的“好看”啊。[/quote]null.GetDBParam恐怕不行。。。 public static object GetDBParam(object value)
{
if (value == null)
return DBNull.Value;
else
return value;
}
new SqlParameter("@Code", MyHelper.GetDBParam(report.Code))
[/quote]
如果你采用“扩展方法”技术,例如定义一个
public static object GetDBParam(this object value)
就是多写个 this,那么你就可以写new SqlParameter("@Code", report.Code.GetDBParam())
你已经为任意的 object 都添加了一个 GetDBParam 扩展方法。这才真的“好看”啊。 public static object GetDBParam(object value)
{
if (value == null)
return DBNull.Value;
else
return value;
}
new SqlParameter("@Code", MyHelper.GetDBParam(report.Code))
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
//-------------- 明确指定参数的类型,有利于执行计划的准确生成和重用 -------------------------
//如果你不怕麻烦,甚至可以指定字符串的长度
//搜索时的参数 (主要特点是 字符串的空串可以认为是 NULL )
SqlParameter[] spArr = new SqlParameter[]
{
SetSqlParameter("@beginTime",null,SqlDbType.DateTime),
SetSqlParameter("@endTime",null,SqlDbType.DateTime),
SetSqlParameter("@name","小明", SqlDbType.NVarChar),
SetSqlParameter("@desc","", SqlDbType.NVarChar),
SetSqlParameter("@enabled","", SqlDbType.Bit)
};
//插入时的参数 (主要特点是 字符串的空串不能认为是 NULL )
SqlParameter[] spArr2 = new SqlParameter[]
{
SetSqlParameter("@beginTime", DateTime.Parse("2017-09-01") ,SqlDbType.DateTime),
SetSqlParameter("@endTime", null , SqlDbType.DateTime),
SetSqlParameter("@name","小明", false, SqlDbType.NVarChar),
SetSqlParameter("@desc","插入参数", false, SqlDbType.NVarChar),
SetSqlParameter("@enabled", true, SqlDbType.Bit)
};
}
//--------------------- 下面的方法, 你可以加入到你的 SqlHelper --------------------------------
/// <summary>
/// 设置Sql参数
/// </summary>
/// <param name="parameterName"></param>
/// <param name="value"></param>
/// <param name="stringEmptyIsNull"></param>
/// <param name="dbType"></param>
/// <returns></returns>
public static SqlParameter SetSqlParameter(string parameterName, object value, SqlDbType dbType)
{
return SetSqlParameter(parameterName, value, true, dbType);
}
/// <summary>
/// 设置Sql参数
/// </summary>
/// <param name="parameterName"></param>
/// <param name="value"></param>
/// <param name="stringEmptyIsNull"></param>
/// <param name="dbType"></param>
/// <returns></returns>
public static SqlParameter SetSqlParameter(string parameterName, object value, bool stringEmptyIsNull, SqlDbType dbType)
{
if (value == null || (string.IsNullOrEmpty(value.ToString()) && stringEmptyIsNull))
{
return new SqlParameter(parameterName, DBNull.Value);
}
SqlParameter sp = new SqlParameter(parameterName, value);
sp.SqlDbType = dbType;
return sp;
}
}
}
还是EF大法好 貌似只能用DBNull.Value了,至于 可空类型,例如:int? 这样的也就不能使用。
貌似只能用DBNull.Value了,至于 可空类型,例如:int? 这样的也就不能使用。
在数据库字段允许为null。不给值默认就是null把
[quote=引用 2 楼 duanzi_peng 的回复:] new SqlParameter("@abc", (object)cls.abc?? DBNull.Value) -》new SqlParameter("@abc", cls.abc == null ? " " : cls.abc);
[quote=引用 5 楼 u012948520 的回复:] 主要是用到了装箱,很不爽。。。