我运行此查询
"insert into students (StudentName) values ('reza');insert into Records (RecordValue,StudentID)" +
" values (20,@@IDENTITY)";
在C#中获得以下异常:
Characters found after end of SQL statement
答案 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#代码中执行存储过程。