2011-12-06 48 views
2

我正在開發一個web應用程序並遇到問題。當有人試圖(成功或失敗)登錄時,我需要將用戶名和IP地址插入到SQL數據庫表「日誌」中。 ID,時間和日期被自動插入... 出於某種原因,我無法使用我的登錄表單工作。 INSERT語句工作正常,如果我從另一個表單啓動它,但我不能與它用於檢查登錄憑證的SELECT語句一起工作。SQL多重語句,INSERT不能正常工作

我嘗試了不同的解決方案,但沒有一個將數據插入到表中......它不會引發錯誤,它只是不會將新行插入「日誌」表中。

任何幫助表示讚賞。 :)

protected void btnLog_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConn"].ToString())) 
    { 
     string username = null; 
     string password = null; 
     string ipAddress = null; 

     SymCryptography cryptic = new SymCryptography(); 
     SqlCommand cmdSelect = new SqlCommand(); 
     SqlCommand cmdLog = new SqlCommand(); 
     SqlDataReader myReader = null; 

     cmdSelect.Connection = conn; 
     cmdLog.Connection = conn; 

     cmdSelect.CommandText = "SELECT * FROM uporabniki WHERE [email protected]_ime AND [email protected]"; 
     cmdSelect.CommandType = CommandType.Text; 
     cmdLog.CommandText = "INSERT INTO log (up_ime, ip) VALUES (@up_ime, @ip)"; 
     cmdLog.CommandType = CommandType.Text; 

     cmdSelect.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdSelect.Parameters.Add("@geslo", SqlDbType.NVarChar, 20).Value = cryptic.Encrypt(tbPwd.Text); 
     cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 

     conn.Open(); 
     try 
     { 
      //cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 
      myReader = cmdSelect.ExecuteReader(); 
      if (myReader.Read()) 
      { 
       username = myReader["up_ime"].ToString(); 
       password = myReader["geslo"].ToString(); 
       Session["rights"] = myReader["pravice"]; 
       Session["login"] = "OK"; 
       pravice = true; 
      } 
      myReader.Close(); 
      //cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
     conn.Close(); 
    } 
    //I tried to open connection again, but stil INSERT does not work 
    /* using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConn"].ToString())) 
    { 
     string ipAddress = null; 
     SqlCommand cmdLog = new SqlCommand(); 
     cmdLog.Connection = conn; 
     cmdLog.CommandText = "INSERT INTO log (up_ime, ip) VALUES (@up_ime, @ip)"; 
     cmdLog.CommandType = CommandType.Text; 
     cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
     cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 
     conn.Open(); 
     try 
     { 
      cmdLog.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
     conn.Close(); 
    } 

    if (pravice == true) 
    { 
     Response.Redirect("Default.aspx"); 
    } 
    else 
    { 
     Response.Redirect("Login.aspx"); 
    }*/ 
} 
+1

你是否收到某種錯誤信息? – Pieter

+0

日誌表上的任何約束(如唯一鍵或主鍵)? – hcb

+0

我沒有看到眼前的問題,但我建議您將此代碼從您的單擊事件中提取出來,並放入另一個可以調用的類中。讓SQL亂丟你的事件處理程序通常不是一個好習慣。 – taylonr

回答

3

您不執行您的cmdLog.ExecuteNonQuery();聲明。

此外,請嘗試在您的sql數據庫中打開一個查詢窗口,並針對它運行以下內容。

INSERT INTO log (up_ime, ip) VALUES (<some time>, <test ip text>) 

如果錯誤在於SQL服務器,你應該返回一個錯誤消息,指出如果問題在於withing SQL服務器。

也嘗試改變:

cmdLog.Parameters.Add("@up_ime", SqlDbType.NVarChar, 20).Value = tbUsr.Text; 
    cmdLog.Parameters.Add("@ip", SqlDbType.NVarChar, 20).Value = ipAddress; 

:您的連接字符串值

cmdLog.Parameters.Add("@up_ime", tbUsr.Text); 
    cmdLog.Parameters.Add("@ip", ipAddress); 
+0

這些評論是不存在的實際代碼,所以我執行它;)我只是指出我試圖執行它,但它在任何情況下都不起作用。我嘗試使用INSERT語句,因爲它是在MS SQL SERVER中,它的工作...它只是不工作,當我從登錄表單,它會嘗試更改參數,thnx – user1080533

+0

我改變了參數,它現在工作。將研究它爲什麼它以前沒有工作。 :) – user1080533

+0

你有SQL Profiler嗎?如果是這樣,請嘗試查看是否在C#中聲明sql db類型時正確傳入sql調用。我很少使用這種風格的聲明,因爲我曾經遇到過多的問題,因此很簡單。 – gsirianni

1

檢查是否正常。還有一個突破點:

conn.Open(); 

看看你是否得到一個錯誤? 如果沒有,那就意味着你的連接字符串沒問題。

取消註釋此行後嘗試{}

//cmdLog.ExecuteNonQuery(); I tried it here, but it doesn't work 

,把一個破發點就可以了..看看你是否得到一個錯誤?

同樣從你的代碼中,我可以看到你在表中插入一個空的IP地址值。查看數據庫中的列是否允許接受空值?

+0

我的連接字符串是好的,因爲它連接到數據庫並從另一個表中讀取用戶登錄憑證,同時日誌表接受空IP地址......但是,我會再次查看它,thanx – user1080533

+0

我改變了參數,因爲它是在另一個答案中建議並按照您的建議嘗試後執行sql命令,現在可以工作 – user1080533

0

using語句將清理垃圾收集過程中的連接,這種連接發生在不確定的時間。這就是爲什麼您嘗試執行的命令中有一個不起作用(連接可能無法使用)。建議你做之一:對新opeend連接使用(連接),請確保您關閉連接在finally()塊,並在1

  1. 這兩種操作重新初始化你的命令。

  2. 有2個不同的連接conn1和conn2並在每個連接執行單獨的操作。

編輯:我重新讀了,你說沒有錯誤發生? - 嘗試檢查ExecuteNonQuery的結果(它返回一個整數以顯示已受到影響的行數 - 如果爲零,則說明插入語句存在問題)。