在我的 .NET 4.5、C# 应用程序中,我在 SQL Server 2012 的一行中插入了 90 个加值。其中一些值被插入到“浮点”列中。但是,此“浮点”列的某些源值小于 0。在这些特定列上,我需要将空值插入列中,或者根本不插入列中。
关于如何最好地实现这一点的任何建议。
我尝试使用具有 Variant 类型的 SqlParameter,并将值转换为“对象”,但这不是最好的解决方案。
INSERT INTO YourTable (FloatColumn)
SELECT CASE TestValue
WHEN FloatColumn<0 THEN NULL ELSE TestValue
END
FROM SourceTable
一种选择是使用INSTEAD OF INSERT
触发器。
有关示例,请参阅 MSDN 上的以下文章。
http://msdn.microsoft.com/en-us/library/ms175089(v=SQL.105).aspx
可以在视图或表上定义 INSTEAD OF INSERT 触发器以替换 INSERT 语句的标准操作。
此触发器将在插入时触发,您的逻辑可以检测值并采取适当的操作,例如如果值小于 0,则将 null 插入该字段。
当您为 SQL 调用构建参数列表时,悬挂 C# 的浮点类型的一个小扩展方法应该可以很好地帮助您:
public static SqlParameter PositiveOrNullSqlParameter( this float value , string name )
{
return PositiveOrNullSqlParameter( (double) value , name ) ;
}
public static SqlParameter PositiveOrNullSqlParameter( this double value , string name )
{
SqlParameter p = new SqlParameter( name , System.Data.SqlDbType.Float ) ;
p.Value = ( value > 0 ? (object) value : (object) DBNull.Value ) ;
return p ;
}
一旦你有了...
int insertDataIntoMyTable( double p1 , double p2 , ... , double p99 )
{
int rowcount ;
string connectString = ConfigurationManager.ConnectionStrings[ "MyConnectionString" ].ConnectionString ;
using ( SqlConnection conn = new SqlConnection( ) )
using ( SqlCommand cmd = conn.CreateCommand() )
{
cmd.CommandText = "insertDataIntoTable" ;
cmd.CommandType = CommandType.StoredProcedure ;
cmd.Parameters.Add( p1.PositiveOrNullSqlParameter( "@p01" ) ;
cmd.Parameters.Add( p2.PositiveOrNullSqlParameter( "@p02" ) ;
.
.
.
cmd.Parameters.Add( p99.PositiveOrNullSqlParameter( "@p99" ) ;
rowcount = cmd.ExecuteNonQuery() ;
}
return rowcount ;
}