Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server 2012,当值小于0时插入null_C#_.net_Sql - Fatal编程技术网

C# SQL Server 2012,当值小于0时插入null

C# SQL Server 2012,当值小于0时插入null,c#,.net,sql,C#,.net,Sql,在我的.NET4.5 C#应用程序中,我在SQLServer2012中将90多个值插入到一行中。一些值被插入到“float”列中。但是,此“float”列的某些源值小于0。对于这些特定的列,我需要在列中插入null,或者根本不在列中插入 关于如何最好地实现这一点的任何建议 我尝试过使用带有变量类型的SqlParameter,并将值转换为“object”,但这不是最好的解决方案。一个选项是使用而不是INSERT触发器 有关示例,请参阅下面关于MSDN的文章 可以在视图或表上定义INSERT触发器

在我的.NET4.5 C#应用程序中,我在SQLServer2012中将90多个值插入到一行中。一些值被插入到“float”列中。但是,此“float”列的某些源值小于0。对于这些特定的列,我需要在列中插入null,或者根本不在列中插入

关于如何最好地实现这一点的任何建议


我尝试过使用带有变量类型的SqlParameter,并将值转换为“object”,但这不是最好的解决方案。

一个选项是使用
而不是INSERT
触发器

有关示例,请参阅下面关于MSDN的文章

可以在视图或表上定义INSERT触发器来代替INSERT触发器 替换INSERT语句的标准操作

此触发器将在insert时触发,您的逻辑可以检测值并采取适当的操作,如在值小于0时在该字段中插入null。

insert到您的表中(FloatColumn)
INSERT INTO YourTable (FloatColumn)
SELECT CASE TestValue
          WHEN FloatColumn<0 THEN NULL ELSE TestValue
       END
FROM SourceTable
选择casetestvalue
当FloatColumn为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 ;
}

请发布用于插入这些值的代码。能否共享用于插入的sql脚本?需要使用
DBNull.Value
插入空值。设置
SqlParameter
的值时,无论参数的定义类型如何,它都会采用类型
object
,因此可以无缝地将其设置为浮点值或
DBNull
。任务是修复插入C端的值(这样服务器就不会看到负值)或者在SQL Server端?你不需要一个
端吗?这似乎真的是一种会丢失和未记录的解决方案,几年后会有人进行调试,试图找出为什么他们的负数会被悄悄删除。就像我说的,这是一个选项,或者是一个工具。如果你没有做太多的数据库开发,那么是的,你可能很难找到它。如果它是正常过程的一部分,那么您将不会有困难跟踪它。