2015-08-24 35 views
0

這是我的代碼:ASP.NET和SQL Server的DateError

protected void Page_Load(object sender, EventArgs e) 
{ 
    DateOfBirth.Text = Session["DateOfBirth"].ToString(); 
    Member.Text = Session["Member"].ToString();  
} 

protected void btn_Confirm_Click(object sender, EventArgs e) 
{ 
    SqlConnection cnn; 
    SqlCommand cmd; 

    string sql = "INSERT INTO Member (MemberJoinDate,DateOfBirth) VALUES (@MemberJoinDate,@DateOfBirth)"; 

    cnn = new SqlConnection(SqlDataSource1.ConnectionString); 

    try 
    { 
     cnn.Open(); 

     cmd = new SqlCommand(sql, cnn); 
     cmd.Parameters.Add("@MemberJoinDate", SqlDbType.Date); 
     cmd.Parameters["@MemberJoinDate"].Value = Member.Text; 
     cmd.Parameters.Add("@DateOfBirth", SqlDbType.Date); 
     cmd.Parameters["@DateOfBirth"].Value = MemberID.Text; 

     cmd.ExecuteNonQuery(); 

     cmd.Dispose(); 
     cnn.Close(); 

     btn_Confirm.Visible = false; 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex); 
    } 

輸入之後:

Name : Random 
Members Join Date : 08/23/2015 
Date of birth : 08/23/2015 

我得到這個錯誤:

System.FormatException:無法將參數值從 字符串轉換爲DateTime。

System.FormatException:String不是 被識別爲有效的DateTime。

在System.DateTimeParse.Parse(字符串s的DateTimeFormatInfo dtfi,DateTimeStyles樣式)
在System.Convert.ToDateTime(字符串值,的IFormatProvider提供商)
在System.String.System.IConvertible.ToDateTime(的IFormatProvider提供商)
在System.Convert.ChangeType(對象值,類型conversionType, 的IFormatProvider提供商)
在System.Data.SqlClient.SqlParameter.CoerceValue(對象值,元類型 destinationType,布爾& coercedToDataFeed,布爾& typeChanged, 布爾允許流)內部異常堆棧跟蹤的
--- ---完
在System.Data.SqlClient.SqlParameter.CoerceValue(對象值,元類型 destinationType,布爾& coercedToDataFeed,布爾& typeChanged, 布爾allowStreaming)
在System.Data.SqlClient.SqlParameter.GetCoercedValue()
在System.Data.SqlClient.SqlParameter.Validate(的Int32索引,布爾 isCommandProc)
在System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser解析器, SqlParameterCollection參數)
在System.Data.SqlClient.SqlCommand.BuildExecuteSql(的CommandBehavior 行爲,字符串的CommandText,SqlParameterCollection參數, _SqlRPC & RPC)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾returnStream,布爾 異步,的Int32超時,任務&任務,布爾asyncWrite,SqlDataReader的 DS)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾returnStream,字符串 方法,TaskCompletionSource`1完成Int32超時,任務&任務, 布爾asyncWrite)
在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 完成,字符串methodName中,布爾sendToPipe,的Int32超時, 布爾asyncWrite)
在System.Data.SqlClient.SqlCommand.ExecuteNonQuery( )
在Summary.btn_Confirm_Click(對象發件人,EventArgs的)

+1

您需要將文本輸入'Member.Text'轉換爲.NET'DateTime'第一個對象,然後將其設置爲參數的值。 –

+0

是MM/DD/YYYY格式的08/23/2015嗎?這可能不是當前文化正在使用的格式。嘗試23/08/2015。 – StingyJack

+0

MemberID真的是出生日期嗎?我懷疑你正在嘗試使用錯誤控件的值。它應該來自您的避孕日期,而不是MemberID。 –

回答

0

該錯誤消息是清楚的。爲了將字符串自動轉換爲DateTime,它必須採用特定的格式。你沒有這種格式,所以它沒有被轉換。您應驗證日期以確保它們的格式正確,然後將它們解析爲DateTime對象,然後將其作爲參數提供給該命令。我將離開驗證部分給你,但這裏的解析代碼:

DateTime MemberJoinDate = DateTime.Parse(Member.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture); 
cmd.Parameters.Add("@MemberJoinDate", MemberJoinDate); 

,如果你想測試提供的文本是否是正確的格式,您可能希望使用日期時間解析的另一種變型。看看DateTime.ParseExact

此外,你打開的數據庫連接,然後添加參數浪費資源。而且您需要確保數據庫連接關閉,即使發生錯誤。以下是我會寫:

var cnn = new SqlConnection(SqlDataSource1.ConnectionString); 
var cmd = new SqlCommand("INSERT INTO Member (MemberJoinDate,DateOfBirth) VALUES (@MemberJoinDate,@DateOfBirth)", cnn); 

cmd.Parameters.Add("@MemberJoinDate", DateTime.Parse(Member.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture)); 
cmd.Parameters.Add("@DateOfBirth", DateTime.Parse(DateOfBirth.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture)); 

try 
{ 
    cnn.Open();    
    cmd.ExecuteNonQuery();    
} 
catch (Exception ex) 
{ 

    //Response.Write(ex); //probably shouldn't write directly to the response 
    ClientScriptManager.RegisterStartupScript(this.GetType(), "InsertionError", "alert('Something went wrong while saving the data!')", true); 
} 
finally // this code will always get executed, even if there's a problem in the try block 
{ 
    cmd.Dispose(); 
    cnn.Close(); 
} 
btn_Confirm.Visible = false; 
+0

我插入後得到這個錯誤: 日期時間MemberJoinDate = DateTime.ParseExact(Member.Text, 「MM/DD/YYYY」,System.Globalization.CultureInfo.CurrentCulture); 日期時間DateOB = DateTime.ParseExact(DateOfBirth.Text, 「MM/DD/YYYY」,System.Globalization.CultureInfo.CurrentCulture); –

+0

System.Data.SqlClient.SqlException(0x80131904):必須聲明標量變量「@MemberJoinDate」。 –

+0

@MongMienRen我已經更正了我的答案中的代碼。錯過了&符號。請再試一次。 – mason

-1

此錯誤是基於兩個日期時間格式不同,因此您可以同時設置爲相同的one.More信息檢查該CultureInfo.InvariantCulture Property

檢查這個例子:

using System.Globalization;//namespace 

DateTime Membersjoin_Table= DateTime.ParseExact(MemberJoin.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture);