【问题标题】:SQL Server 2012, Inserting null when value less than 0SQL Server 2012,当值小于 0 时插入 null
【发布时间】:2012-11-09 20:15:29
【问题描述】:

在我的 .NET 4.5 C# 应用程序中,我在 SQL Server 2012 的一行中插入了 90 个加值。其中一些值被插入到“浮点”列中。但是,此“浮点”列的某些源值小于 0。在这些特定列上,我需要将空值插入列中,或者根本不插入列中。

关于如何最好地完成此任务的任何建议。

我尝试过使用类型为 Variant 的 SqlParameter,并将值转换为“对象”,但这不是最佳解决方案。

【问题讨论】:

  • 请发布您用来插入这些值的代码。
  • 可以分享一下插入的sql脚本吗?
  • 您需要使用DBNull.Value 插入一个空值。当您设置SqlParameter 的值时,它已经采用object 类型,而不管参数定义的类型如何,因此您可以将其无缝设置为浮点值或DBNull
  • 修复插入值的任务是 C# 端(因此服务器永远不会看到负值)还是在 SQL Server 端?

标签: c# .net sql


【解决方案1】:
INSERT INTO YourTable (FloatColumn)
SELECT CASE TestValue
          WHEN FloatColumn<0 THEN NULL ELSE TestValue
       END
FROM SourceTable

【讨论】:

  • 你不需要END吗?
【解决方案2】:

一种选择是使用INSTEAD OF INSERT 触发器。

有关示例,请参阅 MSDN 上的以下文章。

http://msdn.microsoft.com/en-us/library/ms175089(v=SQL.105).aspx

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

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

【讨论】:

  • 这似乎真的是那种会丢失和无证的解决方案,几年后有人会调试,试图弄清楚为什么他们的负数会被默默地删除。
  • 就像我说的,它是一种选择,或者是一个随身携带的工具。如果你不做太多的数据库开发,那么是的,你可能很难追踪它。如果它是正常流程的一部分,那么您将不会遇到任何问题。
【解决方案3】:

在为 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 ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多