2

警告: 私は C# と SQL を初めて使用します (C# で 2 か月未満、SQL で 6 か月未満)

私はこれに数日間取り組んできましたが、私は不可能を求めていると思い始めています。

2 つのローカル データベースがあります。1 つ目は、サードパーティからデータを受け取る一時データベースです。このデータは XML 形式であり、重複するレコードが含まれています。

データを一時データベースに挿入してから、INSERT INTO.. を使用して一意のレコードを最終データベースに移動したいと考えています。

SQL への挿入を作成してテストしましたが、問題なく動作します。次に例を示します。

INSERT INTO Final.dbo.R_DATA
(C1, C2,..)
SELECT distinct     C1, C2, ...
FROM Temp.dbo.R_DATA
WHERE NOT EXISTS(Select *
FROM Final.dbo.R_DATA
WHERE (R_DATA.C1=Final.dbo.R_DATA.C1))

これは機能します。私は Final.dbo.R_DATA のシノニムを作成しようとしましたが、それをクエリで置き換えました - SQL Express でも動作します。また、ストアド プロシージャとしてシノニムを使用する場合と使用しない場合の両方のクエリを設定しましたが、これらは両方とも SQL Express 内から機能します。

次に、以下を使用して C# から同じクエリを実行しようとします。

string sqlConnStr = @"DataSource=.\SQLEXPRESS;AttachDbFilename=W:\SQL\**Temp.mdf;Integrated Security=True;Connect Timeout=120;User Instance=True";
FileInfo SQLfile = new FileInfo(@"W:\SQL\MOVETEST.sql");

MOVETEST は、私が試している sql スクリプトです。上記のクエリをプロシージャに変換し、そのプロシージャを sql に配置しました。

string script = SQLfile.OpenText().ReadToEnd();
SqlConnection connection = new SqlConnection(sqlConnStr);
connection.Open();
Server server = new Server(new ServerConnection(connection));

私はこれをフォームから実行しています-テストのためにボタンをクリックしますが、それが機能する場合は、より長い手順の一部にしたいと思います。これは、接続が開いていることを確認するためのものです

StatusMessage.AppendText(connection.ServerVersion + " " + connection.State);
server.ConnectionContext.ExecuteNonQuery(script);
connection.Close();

それは server.ConnectionContect.ExecuteNonQuery(script); にあります。エラーが発生すること-何を試しても、無効なオブジェクトエラーが発生します。あるデータベースのテーブルから別のデータベースにデータを挿入する方法がない、または何か不足していると考えています。私はこれを次のように機能させることができると思います:

  1. Temp.R_DATA から個別の行をその Temp データベースの新しい tempR_DATA テーブルに抽出します。
  2. bulkcopy を使用して、TempR_DATA テーブル全体を dbo.FINAL に移動します。
  3. dbo.Final に接続し、そこでクエリを実行して FINAL.dbo.temp.R_DATA から FINAL.dbo.R_DATA に挿入します (存在しない場所を使用)。

しかし、何かが遅いと言っているので、これらの読み取りと書き込みをすべて避けたいと思います。

それで、私は何を見落としていますか?あらゆるコメントを歓迎します。これは、構文などではなく、概念 (これをどのように実行しようとしているか) の問題であると感じています。

コンラッドは正確なエラーについて尋ねました:

System.Data.SqlClient.SqlException was unhandled   Message=Invalid object name '**Final.dbo.RELEASE_DATA'.   Source=.Net SqlClient Data Provider   ErrorCode=-2146232060   Class=16   LineNumber=3   Number=208   Procedure=MoveRELEASE_DATA   Server=\\.\pipe\37E36041-6FB1-4D\tsql\query   State=1   StackTrace:
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at DataLoader.Imports.button2_Click(Object sender, EventArgs e) in c:\mydocs\visual studio 2010\Projects\PathFinder\PathFinder\Imports.cs:line 363
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at DataLoader.Program.Main() in c:\mydocs\visual studio 2010\Projects\PathFinder\PathFinder\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)        
   at System.Threading.ThreadHelper.ThreadStart()   InnerException:

これがエラーメッセージです - 同じ - 無効なオブジェクトです。データベース間で挿入を行おうとすると、常にこれが表示されます。ありがとうございました。

4

1 に答える 1

3

このコードは機能するはずです:

using (SqlConnection connection = new SqlConnection("DataSource=..."))
using (SqlComamnd command = connection.CreateCommand())
{
    command.CommandText = "INSERT INTO ...";

    connection.Open();
    int i = command.ExecuteNonQuery(); // number of rows inserted
}

また、ストアドプロシージャ内でクエリをラップすることをお勧めします。

于 2012-06-08T15:15:00.630 に答える