2011-12-06 49 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的结果(它返回一个整数以显示已受到影响的行数 - 如果为零,则说明插入语句存在问题)。