2012-11-09 86 views
0

在我的.NET 4.5,C#应用程序中,我将90个值插入到SQL Server 2012中的一行中。其中一些值被插入到'float'列中。然而,这个'float'列的一些源值小于0.在这些特定的列上,我需要在列中插入一个空值,或者根本不插入到列中。SQL Server 2012,当值小于0时插入null

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

我试过使用SqlParameter类型的变体,并将值转换为'对象',但这不能是最好的解决方案。

+0

请发布您用于插入这些值的代码。 – Oded

+0

你可以请分享插入的SQL脚本? – Rikki

+3

您需要使用'DBNull.Value'来插入空值。设置'SqlParameter'的值时,无论参数的定义类型如何,它都已经接受'object'类型,因此您可以将其无缝地设置为浮点值或'DBNull'。 – mellamokb

回答

0

一个选项是使用INSTEAD OF INSERT触发器。

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

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

INSTEAD INSERT触发器可以在视图或表被定义为 替换INSERT语句的标准动作。

该触发器将在插入被解雇,你的逻辑可以检测值,并采取适当的措施,如无效插入到该字段,如果该值小于0

+0

这看起来像是一种会丢失和无证的解决方案,而有些人会在几年后进行调试,试图弄清楚为什么他们的负数被无声地丢弃。 – mellamokb

+0

就像我说过的那样,这是一种选择,或者是一种工具。如果你不做大量的db开发,那么是的,你可能会遇到麻烦。如果它是正常程序的一部分,那么你不会有麻烦追踪它。 –

2
INSERT INTO YourTable (FloatColumn) 
SELECT CASE TestValue 
      WHEN FloatColumn<0 THEN NULL ELSE TestValue 
     END 
FROM SourceTable 
+1

你不需要'END'吗? – dwerner

+0

谢谢。修复。 – JohnFx

0

小扩展方法挂的C#“单曲,而你建立参数列表为您的SQL调用浮点类型应该做你很好:

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