2015-05-01 85 views
-1

我有一個利用SQL Server數據庫的C#應用​​程序。插入一行後,我需要創建的行的ID。我嘗試了select max(id) from mytable,但如果其他用戶在此期間插入了一行,則此結果不正確。如何獲取插入行的ID(新)

這是我的代碼:

public string ConnectionString = @"Data Source=.;Initial Catalog=n_hesabdata;Integrated Security=True"; 

public void ExecuteNonQuery(string CommandText) 
{  
    try {  
     connection.ConnectionString = ConnectionString; 
     connection.Open(); 
     command.CommandText = CommandText; 
     command.Connection = connection; 
     command.ExecuteNonQuery();   
     command.Dispose(); 
     connection.Close();  
    } catch (Exception error) { 
     connection.Close(); 
    } 
} 

ExecuteNonQuery("insert into Orders (Ctm_phone, Ctm_FullName) VALUES (" + Ctm_phone.text + ", N'" + Ctm_name.Text + "')"); 

我如何獲得新插入的行的ID

+2

值得注意的是,您可以開放SQL注入。插入那樣的原始數據 – Jonesopolis

+0

這是與PHP/MySQL有關的任何方式嗎? – Maximus2012

+1

這是C#,而不是PHP – user4035

回答

1

您應該更改您的代碼是這樣的

ConnectionString = @"Data Source=.;Initial Catalog=n_hesabdata;Integrated Security=True"; 
public int ExecuteInsertWithIdentity(string CommandText, List<SqlParameter> prms) 
{  
    using(SqlConnection connection = new SqlConnection(ConnectionString)) 
    using(SqlCommand cmd = new SqlCommand(CommandText + 
           ";SELECT SCOPE_IDENTITY();", connection)) 
    { 
     connection.Open(); 
     if(prms != null && prms.Count > 0) 
      cmd.Parameters.AddRange(prms.ToArray()); 
     int lastID = Convert.ToInt32(cmd.ExecuteScalar());   
     return lastID; 
    } 
} 
.... 

List<SqlParameter> prms = new List<SqlParameter>(); 
SqlParameter p1 = new SqlParameter() {ParameterName = "@phone", 
             SqlDbType = SqlDbType.NVarChar, 
             Value = Ctm_phone.text}; 
SqlParameter p2 = new SqlParameter() {ParameterName = "@Name", 
             SqlDbType = SqlDbType.NVarChar, 
             Value = Ctm_name.Text}; 
prms.AddRange(new SqlParameter[] {p1, p2}); 
int lastOrderID = ExecuteInsertWithIdentity(@"insert into Orders 
              (Ctm_phone,Ctm_FullName) 
              VALUES (@phone, @name)", prms); 

這樣,執行查詢代碼需要值的參數集合。這消除了Sql注入的可能性。現在,在您的Orders表中取回數據庫引擎插入的最後一個ID的問題只需解決,即可將SELECT SCOPE_IDENTITY()附加到您的命令中。 SqlClient SqlCommand類能夠在單次訪問數據庫時執行多個語句並返回最後一條語句。在這種情況下,從您的連接添加到您的訂單表中的行的IDENTITY列的值(而不是其他連接)

+0

感謝您的幫助。我測試它... –

+0

它給出錯誤:prms.Add(「@ phone」,SqlDbType.NVarChar).Value = Ctm_phone.text; prms.Add(「@ name」,SqlDbType.NVarChar).Value = Ctm_name.Text; ****爲什麼? –

+0

對不起,試圖修復它 – Steve

0
  • 通常情況下,您應該使用entitymanager插入新條目。當id屬性註釋爲@Id時,它應該在MERGE將對象放入表中時接收下一個空值,此時值爲NULL。
  • 但是,如果你真的想INSERT顯式使用SQL,那麼你應該將INSERT拆分爲1.)從序列中獲得一個新的ID 2.)然後將數據寫入表(使用步驟1中的序列nimber)。 )