2016-06-08 86 views
1

我將數據插入到數據庫中的存儲過程,像這樣:ASP.NET無法參數值從字符串轉換爲datetime

SqlParameter parameter2 = new SqlParameter("@actualFinish", SqlDbType.DateTime); 
          parameter2.Value = sortedCells[i].finishedDate; 
          parameter2.Direction = ParameterDirection.Input; 
          command.Parameters.Add(parameter2); 

我有我的問題是,當我嘗試插入一個空日期""我得到這個錯誤:

Failed to convert parameter value from a String to a DateTime 

我插入列可以允許空值....所以我將如何說,如果這是""然後給它一個NULL

+0

使用三元運算符。類似於parameter2.Value =(!sortedCells [i] .finishedDate,Equals(string.Empty)?sortedCells [i] .finishedDate:DBNull.Value; –

回答

2

你可能要考慮明確地把它當作一個參數之前,解析您的日期,並做了檢查,看它是否包含一個值,以確定是否應該通過DateTime對象或DBNull.Value:對於

DateTime finishDate = DateTime.MinValue; 
// This will attempt to parse the value if possible 
DateTime.TryParse(sortedCells[i].finishedDate, out finishDate); 

// Build your parameter here 
SqlParameter parameter2 = new SqlParameter("@actualFinish", SqlDbType.DateTime); 
parameter2.Direction = ParameterDirection.Input; 
// If you are using a nullable field, you may want to explicitly indicate that 
parameter2.IsNullable = true; 

// Then when setting the value, check if you should use the value or null 
if(finishDate == DateTime.MinValue) 
{ 
    parameter2.Value = DBNull.Value; 
} 
else 
{ 
    parameter2.Value = finishDate; 
} 

// Finally add your parameter 
command.Parameters.Add(parameter2); 
0

檢查一個空字符串並替代DBNull.Value。

parameter2.Value = string.IsNullOrWhiteSpace(sortedCells[i].finishedDate) 
    ? DBNull.Value 
    : sortedCells[i].finishedDate; 

或者,在存儲過程定義中給參數默認值NULL,然後只在非空時設置該值。

存儲過程:

CREATE PROCEDURE [YourSchema].[YourProcedure] 
...snip... 
@actualFinish DATETIME = NULL 
...snip... 

然後:

if(!String.IsNullOrWhiteSpace(sortedCells[i].finishedDate) 
    parameter2.Value = sortedCells[i].finishedDate; 

編輯補充:

使用一個可爲空的日期時間會更清楚,我想,然後讓隱含字符串轉換做它的事情。

DateTime? finishedDate = null; 
if(!String.IsNullOrWhiteSpace(sortedCells[i].finishedDate)) 
     finishedDate = DateTime.Parse(sortedCells[i].finishedDate); 

然後finishedDate始終是您的參數值。通過使用TryParse並在日期解析失敗時通知用戶,您甚至可以更安全。儘管TryParse不會使用可爲空的類型,所以您可以使用兩個變量,也可以使用常規的DateTime變量,並將DateTime.Min用作「no date」的標記值,並使用三元運算符將其切換爲null。許多方法來剝皮這隻貓。

+0

我試過'parameter2.Value = string.IsNullOrWhiteSpace(sortedCells [i]。已完成日期) ?DBNull.Value :sortedCells [i] .finishedDate;'並得到此錯誤'無法確定條件表達式的類型,因爲在System.DBNull和字符串之間沒有隱式轉換' – user979331

+0

啊,將DBNull強制轉換爲參數(string)DBNull.Value。我通常在SP中使用默認參數值,而不是顯式傳入null。 –

0

在傳遞值之前,應始終將其轉換爲正確的類型。

var actualFinishParameter = new SqlParameter("@actualFinish", SqlDbType.DateTime); 
Object actualFinish = DBNull.Value; 
DateTime finishDate; 
if(DateTime.TryParse(sortedCells[i].finishedDate, out finishDate)) 
    actualFinish = finishDate; 
actualFinishParameter.Value = actualFinish; 
command.Parameters.Add(actualFinishParameter); 
0

在適當的表中,將NULL添加到適當的日期列。

[FinishedDate] [datetime] NULL。

希望這會起作用。

相關問題