【问题标题】:There was an error parsing the query. How to resolve it?解析查询时出错。如何解决?
【发布时间】:2019-08-17 23:18:30
【问题描述】:

我想运行我首先从 .sql 文件中读取的 sql 语句。

我收到此错误: {"There was an error parsing the query. [ Token line number = 13,Token line offset = 1,Token in error = ALTER ]"}

.sql文件中有我的sql语句:

CREATE TABLE [Test]
(
   [Id] INT NOT NULL IDENTITY (1,1),
   [DatabaseVersion] NVARCHAR(20) NOT NULL,
   [Autorun] BIT,
   [CurrentCulture] NVARCHAR(10),
   [MailNotificationEnabled] BIT,
   [RefreshInterval] INT,
   [ModifiedDate] DATETIME NOT NULL,
   [schemat] NVARCHAR(255)
)

ALTER TABLE [Test] ADD CONSTRAINT [PK_Test] PRIMARY KEY ([Id])

UPDATE [AppConfig]
SET [DatabaseVersion] = '0.12'

读取文件:

string oldVersion = GetOldDatabaseVersion();
string sqlScript = "";
sqlScript = GetScriptFromAssembly(oldVersion, 
ConfigurationSettings.ValidDatabaseVersion);

ExecuteNonQuery(CommandType.Text, sqlScript);

ExecuteNonQuery方法:

public int ExecuteNonQuery(CommandType type, string sql)
{
    using (SqlCeConnection connection = CreateConnection())
    {
        return ExecuteNonQuery(connection, type, sql);
    }
}

private int ExecuteNonQuery(SqlCeConnection connection, CommandType type, string sql)
{
    using (SqlCeCommand command = new SqlCeCommand())
    {
        command.Connection = connection;
        command.CommandType = type;
        command.CommandText = sql;

        return command.ExecuteNonQuery();
    }
}

我不知道如何解决它。当我在 db 上直接运行脚本时,它可以工作。

【问题讨论】:

  • 我猜SqlCommand 需要用; 分隔命令?这只是一个猜测,因为它似乎无法识别 ALTER 开始一个新语句。
  • 我试过了;/
  • 我现在所做的 - 分别运行每个语句(创建、更改等)。有用。但是我不想在单独的文件中创建所有语句;/

标签: c# parsing sql-server-ce executenonquery


【解决方案1】:
  • 请在 Alter the table 之前使用 Go 关键字

【讨论】:

  • afaik GO不是 SQL,仅由 sql management studio 等工具用于分隔批次。但它不会传输到服务器,因此它不能是SqlCommand 的命令文本的一部分。
【解决方案2】:

已解决:

string sqlScript = GetScriptFromAssembly(GetOldDatabaseVersion(), ConfigurationSettings.ValidDatabaseVersion);

string[] scripts = sqlScript.Split(new string[] { @"/*$$*/" }, StringSplitOptions.None);

foreach(var script in scripts)
    ExecuteNonQuery(CommandType.Text, script);

为 sql 添加分隔符:

CREATE TABLE [Test]
(
   [Id] INT NOT NULL IDENTITY (1,1),
   [DatabaseVersion] NVARCHAR(20) NOT NULL,
   [Autorun] BIT,
   [CurrentCulture] NVARCHAR(10),
   [MailNotificationEnabled] BIT,
   [RefreshInterval] INT,
   [ModifiedDate] DATETIME NOT NULL,
   [schemat] NVARCHAR(255)
)

/*$$*/
ALTER TABLE [Test] ADD CONSTRAINT [PK_Test] PRIMARY KEY ([Id])

/*$$*/
UPDATE [AppConfig]
SET [DatabaseVersion] = '0.12'

【讨论】:

    【解决方案3】:

    您必须将每个语句作为单独的命令运行,如果您使用 GO 分隔每个命令,则可以使用辅助函数之类的代码来分隔命令:

    https://github.com/ErikEJ/SqlCeToolbox/blob/master/src/API/Repositories/ServerDBRepository.cs#L639

    如您所见,我正在使用 DbUp 包中的 SqlCommandReaderStreamed 来执行此操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多