2015-10-17 34 views
1

好的,所以我有一個項目可以模擬停車場售票機。我必須能夠讓用戶登錄,爲他們分配一張票,然後讓他們使用該票據在停車場中按時間計時並按時收費。我將他們的數據插入到具有自動遞增ID列的表中,因爲我需要能夠跟蹤它們的票據並相應地添加/刪除它們。我正在運行這個代碼來將他們的票據添加到數據庫中,並且它運行良好,我遇到了一些麻煩,它們使用數據庫提供的票據ID並將其分配給工作分配中要使用的票據對象。下面是我使用的,當他們在時鐘的代碼。在SQL中將C#變量設置爲自動遞增的列值的值?

private void EnterBtn_Click(object sender, EventArgs e) 
    { 

     DateTime timeIn = new DateTime(); 
     timeIn = DateTime.Now; 
     int ticketID = 0; 

     MessageBox.Show("Entered Parking Garage at: " + timeIn.ToString()); 

     //Insert Data into the table, increment the ticketID, store that as the TicketNumber 
     //in the ticket object 
     string sqlQuery = "INSERT INTO Tickets (TimeIssued)"; 
     sqlQuery += "VALUES (@TimeIssued)"; 
     using (SqlConnection dataConnection = new SqlConnection("Data Source=stusql.otc.edu;Initial Catalog=th0732193;Integrated Security=True")) 
     { 
      using (SqlCommand dataCommand = dataConnection.CreateCommand()) 
      { 
       dataConnection.Open(); 
       dataCommand.CommandType = CommandType.Text; 
       dataCommand.CommandText = sqlQuery; 
       dataCommand.Parameters.AddWithValue("@TimeIssued", timeIn); 
       dataCommand.ExecuteNonQuery(); 
       ticketID = Convert.ToInt32(dataCommand.Parameters["@TicketID"].Value.ToString()); 
       dataConnection.Close(); 

      } 
     } 

     Ticket newTicket = new Ticket(); 
     newTicket.TimeIn = timeIn; 
     newTicket.TicketNumber = ticketID; 
    } 

所以今天的主要問題是,由於該列自動遞增,我不能添加一個參數,或者它會混亂,向上(除非有這樣做,我不知道,如果是這樣,很好!),這是一個問題,因爲我需要將該ticketID分配給票證對象。

我的問題是,我怎樣才能將TicketID存儲在數據庫中我的Ticket對象中的Ticker number屬性。

我已經找遍了,無法找到解決這個問題,這將有助於我在我的具體情況,所以雖然我敢肯定這是一個愚蠢的問題,我真的需要一些幫助,我將不勝感激!

+1

看看這個:http://blog.sqlauthority.com/2007/03/25/sql- server * identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/- 你應該*能夠將select附加到你的查詢中,並通過'Execute'獲取結果名稱)而不是'ExecuteNonQuery()' – Rob

+0

@Rob:最有可能的'.Execute Scalar()'因爲'SELECT'只返回一行,只有一列(新插入的'ID') –

回答

4

改變SQL查詢,如下

string sqlQuery ="INSERT INTO Tickets (TimeIssued) OUTPUT INSERTED.TicketID VALUES(@TimeIssued) 

然後

dataCommand.CommandText = sqlQuery; 
dataCommand.Parameters.AddWithValue("@TimeIssued", timeIn); 
int TicketID = (int) dataCommand.ExecuteScalar(); 
+0

這個工程,你真棒! :) –

1

這是否工作,在dataCommand.ExecuteNonQuery行之後添加它?

dataCommand.CommandText = "SELECT @@IDENTITY"; 
int id = dataCommand.ExecuteScalar(); 
+2

要小心 - 如果應用程序是線程化的,可能會同時插入不同的行,所以這兩個線程將獲得相同的身份。 – Rob

+0

我會推薦使用** SCOPE_IDENTITY()**而不是其他任何東西來獲取新插入的標識值。 [請參閱此博客文章,瞭解有關WHY的解釋](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) –

相關問題