3

コードで SQL Server Compact 4.0 データベースを作成しようとしています。いくつかのシステム ルックアップ テーブルを作成し、それらに値を入力したいと考えています。

そのため、プロジェクトに埋め込まれたリソースとして次のような SQL スクリプトがあります。

CREATE TABLE SomeType
(TypeID INT NOT NULL CONSTRAINT PK_SomeType PRIMARY KEY,
 TypeDesc NVARCHAR(50) NOT NULL
)
GO

INSERT INTO SomeType(TypeID, TypeDesc) VALUES(10, 'Text for value 10')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(20, 'Text for value 20')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(30, 'Text for value 30')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(40, 'Text for value 40')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(80, 'Text for value 80')
GO

SQL Server Compact データベースを作成して初期化するためのコードがいくつかあります。要約すると、次のようになります。

 using (SqlCeEngine engine = new SqlCeEngine(connectionString))
 {
      engine.CreateDatabase();
      CreateInitialDatabaseObjects(connectionString);
 }

 private void CreateInitialDatabaseObjects(string connectionString)
 {
     using (SqlCeConnection conn = new SqlCeConnection(connectionString))
     {
         List<string> resourceNames = new List<string>(Assembly.GetAssembly(typeof(DatabaseInterface)).GetManifestResourceNames());
         resourceNames.Sort();

         List<string> scripts = new List<string>();

         foreach (string scriptName in resourceNames)
         {
             Stream dbScript = Assembly.GetAssembly(typeof(DatabaseInterface)).GetManifestResourceStream(scriptName);

             if (dbScript != null)
             {
                 string contents = new StreamReader(dbScript).ReadToEnd();

                 string[] splitContents = contents.Split(new string[] {"GO"}, StringSplitOptions.RemoveEmptyEntries);

                 foreach (string split in splitContents)
                 {
                     scripts.Add(split);
                 }
             }
         }

         SqlCeCommand cmd = new SqlCeCommand();
         cmd.Connection = conn;

         conn.Open();

         foreach (string script in scripts)
         {
             cmd.CommandText = script;
             cmd.ExecuteNonQuery();
         }

         conn.Close();
      }
  }

したがって、このコードは基本的にすべての埋め込み SQL スクリプトを列挙して読み取り、GOキーワードの内容をサブスクリプトに分割して、順番に実行します。

正常に動作します-少なくともCREATE TABLEステートメントについては....

しかし、SQL Server Compact 4.0 は複数の挿入でチョークします....各行の後にセミコロンを追加しようとしましたがINSERT、うまくいきません - それでもチョークします。

エラーの詳細は次のとおりです。

System.Data.SqlServerCe.SqlCeException was unhandled
Message=クエリの解析中にエラーが発生しました。[トークン行番号 = 4、トークン行オフセット = 1、エラーのトークン = INSERT]
Source=SQL Server Compact ADO.NET Data Provider
ErrorCode=-2147467259
HResult=-2147217900
NativeError=25501

GO各ステートメントの間にステートメントを配置するINSERTと機能しますが、何百もの行を挿入する必要があるテーブルがある場合、少し面倒になります.....

SQL Server Compact が単一の SQL ステートメント ブロックで複数の挿入ステートメントを受け入れて処理できるようにするトリック/方法はありますか??

4

1 に答える 1

4

手品はなく、GOなどのみです。SQL Server Compact では、一度に 1 つのステートメントしか実行できません。私のツールは、既存のデータベースから SQL Compact ステートメントを生成できます。または、SqlCeBulkCopy を使用してデータを高速に読み込むこともできます。

于 2011-10-09T13:17:37.047 に答える