我正在开发一个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");
}*/
}
答案 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中的两个操作,确保关闭finally()块中的连接并针对新的opeend连接重新启动命令。
有2个不同的连接conn1和conn2,并在每个连接中执行单独的操作。