2012-05-21 62 views
1

該程序使用C#WinForms和SQL Server 2008.當我想輸入包含一個DateTimePicker我可以看到的是,措辭是在荷蘭,然後我得到一個錯誤有關的價值轉換。有什麼辦法可以預先編程來解決這個問題嗎?我發現了這個錯誤,現在就是這樣。一個程序在我的電腦上工作正常,但是當我用另一個Windows荷蘭語發送它時,它與DateTimePicker存在問題

error

 try 
     { 
      SqlConnection connect = new SqlConnection("Data Source=Localhost\\SQLExpress;Initial Catalog=DataBase;Integrated Security=True"); 
      SqlDataAdapter da = new SqlDataAdapter(); 

      /******************** Inserting ********************/ 
      string query = "INSERT INTO spending VALUES ("; 
      query += "'" + date_dateTimePicker.Value + "', "; // Date 
      query += "'" + Convert.ToDecimal(amount_spent_textBox.Text) + "', "; // Amount spent 
      query += "'" + spent_on_textBox.Text + "')"; // Spent on 
      connect.Open(); 
      da.InsertCommand = new SqlCommand(query, connect); 
      da.InsertCommand.ExecuteNonQuery(); 

      connect.Close(); 
     } 

     catch (Exception error) 
     { 
      MessageBox.Show(error.ToString()); 
     } 

事情變得厚。我試圖插入一個dateTimePicker的值到數據庫的方式,我用上面的代碼做同樣得到這個錯誤。它在我的電腦上工作得很好,但在這裏不起作用。有人可以解釋嗎?以下是錯誤:使用

error

代碼:

string update = "UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1"; 
     connect.Open(); 
     da.InsertCommand = new SqlCommand(update, connect); 
     da.InsertCommand.ExecuteNonQuery(); 
     connect.Close(); 

好這裏是我現在工作的形式,在一個顯示this error完整的代碼。大多數形式的結構是這樣,所以如果我得到這個權利,不應該有與他們的其餘任何問題。我正在測試這個在我的電腦上,所以如果它在這裏工作,它也應該在那裏工作。

看看,我不知道該怎麼辦了。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace TheNamespace 
{ 
public partial class submit_spending : Form 
{ 
    public submit_spending() 
    { 
     InitializeComponent(); 
    } 

    private void submit_button_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      SqlConnection connect = new SqlConnection("Data Source=Localhost\\SQLExpress;Initial Catalog=TheDataBase;Integrated Security=True"); 
      SqlDataAdapter da = new SqlDataAdapter(); 

      /******************** Inserting ********************/ 
      string query = "INSERT INTO spending VALUES (@date, @amount_spent, @spent_on)"; 
      SqlCommand command = new SqlCommand(query); 
      command.Parameters.AddWithValue("date", date_dateTimePicker.Value); 
      command.Parameters.AddWithValue("amount_spent", Convert.ToDecimal(amount_spent_textBox.Text)); 
      command.Parameters.AddWithValue("spent_on", spent_on_textBox.Text); 

      connect.Open(); 
      da.InsertCommand = new SqlCommand(query, connect); 
      da.InsertCommand.ExecuteNonQuery(); 
      connect.Close(); 

      if (MessageBox.Show("Submitted.", "Spending submitted", MessageBoxButtons.OK) == DialogResult.OK) 
      { 
       this.Close(); 
      } 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.ToString()); 
     } 
    } 

    private void cancel_button_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 
} 
+0

需要代碼,您從選取器中獲取日期。不應該包含任何字符串日期轉換。 –

+0

@TonyHopkinson 有插入值的代碼,它不能在那臺計算機上做,所以我有捕獲,這就是我得到的錯誤圖像。 – Alternatex

+2

@Tony實際上,考慮到他似乎在串聯一個字符串來構建查詢,看起來就像是這樣。 –

回答

1

你或許可以用一個明確的ToString與文化-invariant格式來確保它可以在任何語言環境中使用。這是一個黑客攻擊的一位,但將這一行:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value); 

與這應該工作:

command.Parameters.AddWithValue("date", date_dateTimePicker.Value.ToString("s")); 

這會給你一個ISO 8601格式的日期 - 時間字符串,這是一個國際標準具有明確的規範。此外,此格式不受SQL Server實例上SET DATEFORMAT或SET LANGUAGE設置的影響。

3

也許你有日期時間格式化的問題,它可以通過改變系統日期時間格式到同一個如電腦,它正在被解決,或者你可以在你的代碼做一些額外的工作。對於自定義日期時間格式有一個看看這裏: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

+2

或者你可以簡單地通過'ToString()'輸出服務器可以理解的日期格式。 –

0

只需使用dateTime.ToString("s"),它會給在通用格式的日期時間,無論計算機的文化背景。

7

您應該使用Parameters.AddWithValue()方法。我希望它能正確格式化DateTime

string cmdText = "UPDATE table SET colX = @value WHERE id = @currId"; 
var cmd = new SqlCommand(cmdText, conn); 
cmd.Parameters.AddWithValue("value", dateTimePicker1.Value); 
cmd.Parameters.AddWithValue("currId", id); 
+0

當我嘗試 'string query =「INSERT INTO花費VALUES(@date,@amount_spent,@spent_on)」; connect.Open(); SqlCommand command = new SqlCommand(query); command.Parameters.AddWithValue(「date」,date_dateTimePicker.Value); command.Parameters.AddWithValue(「amount_spent」,Convert.ToDecimal(amount_spent_textBox.Text)); command.Parameters.AddWithValue(「spent_on」,spent_on_textBox.Text);' 它說[this](http://i.imgur.com/6n7Xu.jpg) – Alternatex

+0

你確定'date'不是空值?您也可以在創建命令後進行連接。我沒有附近有C#的電腦來測試。 – Minustar

+0

我試着在代碼後打開連接,但出現同樣的錯誤。日期不能爲空,因爲它來自dateTimePicker,其默認值始終設置爲Now/Today。 – Alternatex

1

理想情況下,你應該寫在T-SQL語句中使用datetime參數,應用程序,以便轉換永遠不會進入畫面。

在您的處置的其他途徑是通過您的應用程序使用的連接(一個或多個)上添加SET DATEFORMAT。因此,您可以將格式更改爲應用程序預期/使用的格式。

0
"UPDATE table SET the_date = '" + the_date_dateTimePicker.Value + "' WHERE instance_ID = 1"; 

使用默認的CultureInfo轉換爲String時發生在這裏。日期時間可以轉換到兩個「29/05/2012」和「05月29日」,這取決於你的工作站上選擇的區域設置。然而,Sql Server可能被配置爲另一個區域設置,因此你有問題(sql server無法解析傳遞的DateTime的字符串表示)

如果你不想面對另一個與CultureInfo相關的問題,你必須使用參數化查詢後來。

1

我認爲你需要指定SqlDBType在command.Parameters分配值到年月日時。並請交叉檢查您已在INSERT語句與參數中指定的參數中指定的參數名稱。添加

string sql = "INSERT INTO spending VALUES (@date, @amount_spent, @spent_on)"; 
using (var cn = new SqlConnection("..connection string..")) 
using (var cmd = new SqlCommand(sql, cn)) 
    { 
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = date_dateTimePicker.Value; 
command.Parameters.AddWithValue("@amount_spent",Convert.ToDecimal(amount_spent_textBox.Text)); 
     command.Parameters.AddWithValue("@spent_on", spent_on_textBox.Text); 

     connect.Open(); 

有的時候它能夠更好地使用固定區域性存儲之類的東西在數據庫中的日期/時間。你可以嘗試CultureInfo.Invariantculture

DateTime date = date_dateTimePicker.Value.Date; 
string sDate = date.ToString("dd-MM-yy", System.Globalization.CultureInfo.InvariantCulture); 
DateTime dateInsert = Convert.ToDateTime(sDate); 
相關問題