【问题标题】:SQL Command string c#SQL 命令字符串 c#
【发布时间】:2020-10-26 08:50:46
【问题描述】:

我目前正在编写一个小脚本,用于导出程序的事件日志并将其写入数据库。但是,我的 SQL insert 命令出现问题。我究竟做错了什么?这只是一个代码剪切

string command = "DECLARE @x xml;";
command += "SELECT @x = P";
command += "FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYSTEM\\MFilesLog\\Event-Log 23.10.2020 09-05.xml', SINGLE_BLOB) AS Products(P)";
command += "SELECT @x";
command += "DECLARE @hdoc int";
command += "EXEC sp_xml_preparedocument @hdoc, OUTPUT, @x";
command += "INSERT INTO [MFlogs].[dbo].[MLogs]";
command += "SELECT * FROM OPENXML(@hdoc, '/Export/root/event/data/objectversion/objver', 2);";
command += "WITH(";
command += "id int '../../../id',";
command += "type varchar(50) '../../../type',";
command += "category varchar(50) '../../../category',";
command += "timestamp varchar(50) '../../../timestamp',";
command += "causedbyuser varchar(50) '../../../causedbyuser',";
command += "objtype varchar(50),";
command += "objid varchar(50),";
command += "version varchar(50),";
command += "objectguid varchar(50) '../objectguid',";
command += "versionguid varchar(50) '../versionguid',";
command += "title varchar(100) '../title',";
command += "displayid int '../displayid')";

SqlCommand cmd = new SqlCommand(command, connection);
int result = cmd.ExecuteNonQuery();

这是来自事件日志的错误:

必须声明@hdoc 标量变量。

有人可以帮忙吗?

【问题讨论】:

  • 调试。打印您的command
  • 考虑使用 StringBuilder 而不是 += 字符串运算符。效率特别低
  • SELECT @x = P 这个语句是错误的,你需要使用 SET @x = 'P' (OK BOTH WORK CORECTLY But 'P' MUST ME IN QUOTES)
  • 你能告诉我们存储的过程吗?

标签: c# sql sqlcommand


【解决方案1】:

只看第一行,你就会遇到问题:

    command += "SELECT @x = P";
    command += "FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYSTEM\\MFilesLog\\Event-Log 23.10.2020 09-05.xml', SINGLE_BLOB) AS Products(P)";

最终会变成这样:

SELECT @x = PFROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORI ....

因为你没有像这样留下任何间距,但在其他任何地方你也需要它:

command += "SELECT @x = P";
command += " FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYSTEM\\MFilesLog\\Event-Log 23.10.2020 09-05.xml', SINGLE_BLOB) AS Products(P)";

尝试修复所有间距问题,看看会发生什么。

【讨论】:

    【解决方案2】:

    OUTPUT 之前不需要逗号。

    替换

    command += "EXEC sp_xml_preparedocument @hdoc, OUTPUT, @x";
    

    command += " EXEC sp_xml_preparedocument @hdoc OUTPUT, @x";
    

    https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-xml-preparedocument-transact-sql?view=sql-server-ver15

    还要在每个字符串的开头添加一个空格,或Environment.NewLine 或使用StringBuilder.AppendLine

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2017-11-11
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多