SQL多语句,INSERT不起作用

时间:2011-12-06 14:58:29

标签: c# .net sql-server

我正在开发一个Web应用程序并遇到了问题。我需要在SQL数据库表中插入用户名和IP地址" log"当有人尝试(成功或不成功)登录时。 ID,时间和日期会自动插入... 出于某种原因,我无法在登录表单中使用它。如果我从另一个表单启动它,INSERT语句可以正常工作,但是我不能将它与我用来检查登录凭据的SELECT语句一起工作。

我尝试了不同的解决方案,但没有一个将数据插入到表中......它不会抛出错误,它只是不会在" log"中插入新行。表

感谢任何帮助。 :)

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 up_ime=@up_ime AND geslo=@geslo";
        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");
    }*/ 
}

3 个答案:

答案 0 :(得分:3)

您没有执行cmdLog.ExecuteNonQuery();言。

另外,尝试在sql数据库中打开一个查询窗口,然后针对它运行以下命令。

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

如果错误在于sql server,则应返回一条错误消息,说明问题是否与SQL Server有关。

也可以尝试更改:

    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);

答案 1 :(得分:1)

检查连接字符串值是否正常。还在:

上设置了一个断点
   conn.Open();

看看你是否收到错误? 如果没有,则表示您的连接字符串正常。

尝试{}

后取消注释此行
 //cmdLog.ExecuteNonQuery();  I tried it here, but it doesn't work

并在其上设置一个断点..看看你是否收到错误?

同样从你的代码我可以看到你在表中插入一个空的ipaddress值。查看数据库中的列是否允许接受空值??

答案 2 :(得分:0)

using语句将清除垃圾收集过程中的连接,该过程在不确定的时间发生。这就是为什么你尝试过的一个执行命令不起作用的原因(连接可能无法使用)。建议你做:

  1. 使用(连接)的1中的两个操作,确保关闭finally()块中的连接并针对新的opeend连接重新启动命令。

  2. 有2个不同的连接conn1和conn2,并在每个连接中执行单独的操作。

  3. 编辑:我重读了,你说没有错误发生? - 尝试检查ExecuteNonQuery的结果(它返回一个整数来显示受影响的行数 - 如果这是零,则说明insert语句有问题。)