我在global.ascx中有以下代码,当我单击生成错误按钮时代码运行但似乎在插入错误中失败到数据库中。
我希望将错误保存到数据库并重定向到default.aspx。
相当标准的东西。
我得到的错误是:exe.Message =“'系统'附近的语法不正确。” (看起来像是在global.asx中使用的SQL对象的某些东西)
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception ex = Server.GetLastError();
StringBuilder theBody = new StringBuilder();
theBody.Append("Error Message: " + ex.ToString() + "\n");
Server.ClearError();
try
{
string sSQL = "INSERT INTO PMISwebErr VALUES ('" + theBody.ToString() + "', GETDATE())";
using (System.Data.SqlClient.SqlConnection con = STAR.Global.GetConnection())
{
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sSQL, con);
cmd.CommandType = System.Data.CommandType.Text;
cmd.ExecuteScalar();
}
Response.Redirect("~/default.aspx?Err=sysError");
}
catch (Exception exe) {
Response.Redirect("~/default.aspx?Err="+ exe.Message.ToString() );
}
}
问题在于添加了错误消息。它有一个打破SQL的单引号。代码在此行获取此值:
theBody.Append("Error Message: " + ex.ToString() + "\n");
sSQL =“插入PMISwebErr值 (“网址: http://localhost:14854/PMIS/Default.aspx \ nReferer: http://localhost:14854/PMIS/Default.aspx \ NIP: 127.0.0.1 \ n错误消息:System.Web.HttpUnhandledException: 类型异常 'System.Web.HttpUnhandledException' 是... ...
这是我快速观看的实际价值,最后看到......很奇怪。
答案 0 :(得分:3)
你真的应该使用参数化插入。我确定您尝试插入的字符串存在引用问题,并且导致异常。
以下是一个例子:
答案 1 :(得分:0)
这应该是ExecuteNonQuery()
电话。 ExecuteScalar()
更适用于从聚合中选择原子值。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx
答案 2 :(得分:0)
正如@ScottE已经预料到的那样,引号存在问题。该字符串由单引号括起来,但内部是文本Exception of type 'System.Web..
,它在您不想要的地方添加引号。
解决方案?使用参数并让驱动程序处理这些引号。