【问题标题】:Guess the error in the insert statement猜猜插入语句中的错误
【发布时间】:2011-01-11 06:59:51
【问题描述】:

有人有鹰眼吗?我想在下面的插入语句中找出错误的位置。我在运行时使用了一个断点来跟踪代码,我得到了异常错误(关键字'Case'附近有一个不正确的语法)。让你老鹰眼...

public partial class OpenCase : System.Web.UI.Page
{
    string adminString;
    protected void Page_Load(object sender, EventArgs e)
    {
        adminString = "CA123";
    }

    protected void openCaseBotton_Click(object sender, EventArgs e)
    {
        //SQL connection string
        SqlDataSource CSMDataSource = new SqlDataSource();
        CSMDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["CMSSQL3ConnectionString"].ToString();

        //SQL Insert command with variables
        CSMDataSource.InsertCommandType = SqlDataSourceCommandType.Text;
        CSMDataSource.InsertCommand = "INSERT INTO Case (CaseID, CaseDesc, DateOpened, CasePriority, AdministratorID) VALUES (@CaseID, @CaseDesc, @DateOpened, @CasePriority, @AdministratorID)";

        //Actual Insertion with values from textboxes into databse fields
        CSMDataSource.InsertParameters.Add("CaseID", caseIDTextBox.Text);
        CSMDataSource.InsertParameters.Add("CaseDesc", caseDescTextBox.Text);
        CSMDataSource.InsertParameters.Add("DateOpened", DateTime.Now.ToString());
        CSMDataSource.InsertParameters.Add("CasePriority", null);
        CSMDataSource.InsertParameters.Add("AdministratorID", adminString.ToString());

        int rowsCommitted = 0;

        //Try catch method to catch exceptions during insert
        try
        {
            rowsCommitted = CSMDataSource.Insert();
            Response.Write(@"<script language='javascript'>alert('The following errors have occurred:');</script>");
        }

        catch (Exception ex)
        {
            //error message displayed when exception occurs


            string script = "<script>alert('" + ex.Message + "');</script>";
            Response.Write("The following Error occurred while entering the records into the database" + " " + ex.ToString() + " ");
            Response.Redirect("~/ErrorPage.aspx", false);
        }
        finally
        {
            CSMDataSource = null;
        }

        //Where to go next if insert was successful or failed
        if (rowsCommitted != 0)
        {
            Response.Redirect("~/CaseAdmin.aspx", false);
        }
        else
        {

            Response.Redirect("~/ErrorPage.aspx", false);
        }

    }

    protected void addExhibitBotton_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/EntryForms/AddExhibit.aspx", false);

    }
}

看到什么了吗?可能你需要一个 C# 错误视觉护目镜...大声笑

【问题讨论】:

    标签: c# asp.net sql insert connection-string


    【解决方案1】:

    INSERT 附近?好吧,CASE 是一个 SQL 保留字,所以尝试简单:

    CSMDataSource.InsertCommand = "INSERT INTO [Case] (...
    

    告诉它Case 是一个对象名称,而不是 SQL 关键字。

    【讨论】:

    • @Selase:也可以试试 [CASE](大写)。因为 DBMS 可以将对象的名称大写(Oracle 可以)。在 MS SQL Server 中使用 [Object Name],在 Oracle 中使用 "Object Name"
    • @Alexander 在 SQL Server 中,大小写可能很重要,具体取决于数据库设置。如果它处于区分大小写的模式,则[Case] 将工作当且仅当表实际上创建为Case - 并且[CASE] 将工作当且仅当 表被创建为CASE。在不区分大小写的模式下,两者都可以正常工作。
    • @Marc:我认为[] 在任何情况下都意味着完全匹配。因此,如果您在不区分大小写的模式下创建 obj,DBMS 将大写其名称,稍后在使用 [] 时,您必须拼写它的存储方式,即大写。手头没有 SQL Server 实例。我错了吗?
    • @Alexander - 不,在 SQL 服务器中,[] 是可选的,只是说“这是一个对象”;主要用于关键字或[tables with spaces],但select * from fooselect * from [foo] 是相同的。
    • 希望我早点看到你的评论,马克。猜想我滚动太多,最终得到了 paxdiablo 建议“案例”的答案。我最确定 [Case] 会在阅读其他答案后起作用。非常感谢您的贡献...非常有帮助...再次感谢
    【解决方案2】:

    我很确定 case 实际上是一个 SQL 关键字。

    根据 DBMS,您可能需要将其括在反引号或其他分隔符中,以告诉执行引擎将其视为非关键字,例如:

    CSMDataSource.InsertCommand = "INSERT INTO `Case` (CaseID, ...
    

    【讨论】:

    • 是吗?好吧,我将我的数据库表命名为案例,那么我应该如何解决这个问题?起初我有一个名为 users 的表,它给了我错误,所以我在 SQL management studio 中测试了该语句,发现以前名为 Users 的表是一个关键字。我经历了地狱来改变名字和所有涉及的关系。我应该更改多少个关键字?天哪..!!!!
    • (1) 查找并使用转义分隔符。 (2) 重命名您的表格。 (3) 嗯,实际上,我能想到的只有两个(如果您不想担心关键字冲突,第一个可能是最好的选择)。我自己从不为对象使用关键字,部分原因是您应该使用更具描述性的名称,部分原因是我看到的 DB2/z 代码看起来像 "insert into date(date,seq) select date,seq+1 from date"
    • @Selase - 完全没有;请仔细查看提供的两个答案 - 这向您展示了如何针对不同的数据库处理此问题。
    • @ Marc- 我尝试从第一个答案中进行更正,将大小写放在像“Case”这样的单引号中,这次异常消息显示“$exception {“'Case' 附近的语法不正确。 “}”所以我必须重命名表然后我猜....
    • @Selease,首先,您需要告诉我们您使用的是哪个 DBMS。例如,MySQL 使用 backticks (不是您在上一条评论中使用的撇号)。我认为 SQLServer 用户方括号。但是,老实说(而且,很抱歉,很残酷),“case”实际上是一个蹩脚的桌子名称。使用更具描述性的内容会更好。
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多