这个SQL查询有什么问题?

时间:2009-12-23 19:33:58

标签: sql sql-server tsql

我运行此查询

"insert into students (StudentName) values ('reza');insert into  Records (RecordValue,StudentID)" +
            " values (20,@@IDENTITY)";

在C#中获得以下异常:

Characters found after end of SQL statement

5 个答案:

答案 0 :(得分:4)

我想您想要检索新插入的学生的身份,然后将其插入“记录”表中,对吗?

我强烈建议您使用SCOPE_IDENTITY()代替@@ IDENTITY,如果您有例如触发你的桌子。 Pinal Dave对这些问题有great blog post

另外,如果从C#调用SQL Server,我强烈建议您使用本机.NET SQL提供程序(SqlConnection,SqlCommand等) - 而不是oledbcommand。

试试这个

using (SqlConnection _con = new SqlConnection("server=(local);database=TEST;integrated security=SSPI;"))
{
    string queryStmt = "INSERT INTO dbo.Students (StudentName) VALUES('reza'); " +
                       "INSERT INTO dbo.Records(RecordID, StudentID) VALUES (20, SCOPE_IDENTITY());";

    using (SqlCommand _cmd = new SqlCommand(queryStmt, _con))
    {
       try
       {
            _con.Open();
            _cmd.ExecuteNonQuery();
            _con.Close();
       }
       catch (Exception exc)
       {
           string msg = exc.Message;
       }
    }
 }

这当然有效,我只是在我的环境中成功测试过。

答案 1 :(得分:1)

我刚刚运行了这段代码,结果就是:

SqlConnection cn = new SqlConnection("...");
SqlCommand cm = cn.CreateCommand();
cm.CommandText = 
    "INSERT INTO MyTable (FieldA) VALUES ('Sample'); " +
    "INSERT INTO MyTable (FieldB) VALUES (@@Identity); ";
cn.Open();
cm.ExecuteNonQuery();

也许你需要在第一个分号后添加一个空格。

答案 2 :(得分:1)

你应该把它包装成一个存储过程,因为逻辑上它是一个工作单元 - 你也可能想从多个位置调用它。

我还会认真考虑是否应该将这两个语句包装成一个事务 - 你不希望插入到学生中成功并且记录失败。好吧,这是一个边缘条件,但它很容易在SP中防范并制作更专业的代码。

在这种情况下使用SP的另一个好处是,当您正在操作几个插入时,很可能您以后想要扩展它 - 例如插入财务表。如果你结束SP,你可以改变SP,而不必为新学生插入的所有实例grep代码,修改和重新编译。

答案 3 :(得分:1)

您可以执行此命令,如图所示 - 您不需要具有临时变量,也不需要在分号后使用“GO”或空格。我同意Marc_s你应该使用SCOPE_IDENTITY()来避免其他交易隐藏价值的问题。

问题是:为什么你的陈述周围有引号,末尾有分号?很明显,你是从代码中提取这个, 是我看的地方。所以......首先,在SQL Server Management Studio等中运行此命令以验证它是否有效。一旦你确认它(它应该工作假设你的表结构是我认为的那样)然后弄清楚你的代码做错了什么。

更新:我在这里笑,因为我的答案是“纠正”许多正在消失的其他答案,因为很明显他们不对。

答案 4 :(得分:0)

您需要创建一个包含这些SQL语句的存储过程,然后从C#代码中执行存储过程。