【问题标题】:Why am I unable to create a trigger using my SqlCommand?为什么我无法使用我的 SqlCommand 创建触发器?
【发布时间】:2010-05-19 19:25:41
【问题描述】:

线路cmd.ExecuteNonQuery();

cmd.CommandText

CREATE TRIGGER  subscription_trig_0  ON  subscription   AFTER INSERT  AS  UPDATE user_data SET msg_count=msg_count+1 FROM user_data
JOIN INSERTED ON user_data.id = INSERTED.recipient; 

例外:

Incorrect syntax near the keyword 'TRIGGER'.

然后使用 VS 2010,连接到同一个文件(一个 mdf 文件),我运行上面的查询并收到一条成功消息。卧槽!

【问题讨论】:

  • @The 编辑:我更喜欢 WTF 标签,我宁愿不固定间距,因为我想显示确切的 sql

标签: c# sql-server triggers


【解决方案1】:

选项

  • 实际发送的 SQL 的第一行不是 CREATE TRIGGER
  • CommandType 错误(例如,它试图添加 EXEC 或一些“准备”命令)

使用 SQL 分析器查看确切您发送到数据库引擎的内容(您实际上拥有托管 MDF 的 Express 版本)

【讨论】:

  • 我很困惑。 “发送的实际 SQL 的第一行不是 CREATE TRIGGER”是什么意思? CommandType 设置为 TEXT。我如何使用/SQL 探查器在哪里?到目前为止,我有 0 个运气和 >5 个关于 MS、SQL 和 IDE 问题的线程。但无论如何,我仍然不理解解决方案,并且在查看分析器时可能不理解。
【解决方案2】:

你的CommandType设置错了吗?

【讨论】:

  • 它设置为文本。不应该是触发器吗?
  • Text 对您正在做的事情是正确的。请发布创建此触发器的所有 C# 代码。
  • 它很丑,因为有 regex.replace。正如我所说的语法适用于视觉工作室。也许我会尝试使用新的 sqlcommand 对象。
  • 我还没有完全测试过,但似乎确实解决了问题。当 cmd 文本中没有 @0 时,我无法想象 .parameters 会影响它。天哪,我只是检查一下。确实如此。查询中没有任何引用参数的内容,并且它会以完全不相关的错误 msg WTF 爆炸。
  • 在命令中添加@parameter 的那一刻,它的调用从“T-SQL Batch”类型变为“RPC”,这是TDS 协议上的不同类型(参见freetds.org/tds.html#requests)。您没有指定 cmd 是什么,每种客户端类型对区别的处理方式不同(ODBC、OleDB、SqlClient)。最值得注意的是,OleDB 客户端在请求前添加了一个 EXEC,结果通常是不正确的语法。尽管这可能是一个晦涩难懂的主题,但一个称职的开发人员都知道,如果不是来自规范,那么来自经验。
【解决方案3】:

我不确定为什么会失败,但如果我是你,我会使用 SMO 进行 ddl 查询。在这种情况下,您需要Trigger.Create Method.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 2022-06-16
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多