0

問題:

データベースでSqlCommand()を使用してSqlコマンドを実行した後、別のデータベースにデータを挿入すると、後続のすべてのステートメントでExceptionInvalidオブジェクト名がエラーになります。

質問:

なぜこうなった?

追加情報:

選択部分のテーブルの前にTempデータベース名を追加することで修正する方法を知っていますが、SQL Management Studioでステートメントを個別に実行する場合ではなく、そのデータベースのコンテキストで実行されているため、必要ありません。

プログラムロジック:

  1. 一時データベースを作成して入力します(すべてのテーブルASI _...)
  2. 一時データベースのコンテキストでデータを選択し、それを別のデータベース(@AcuDB)に挿入します
  3. Xクエリに対してステップ2を繰り返します

挿入コード:

if (TempD.State == System.Data.ConnectionState.Closed) TempD.Open();
                            Command = new SqlCommand(temp, TempD);
                            Command.CommandTimeout = 0;
                            Command.ExecuteNonQuery(); 

前の同様のステートメントの後にそのエラーが実行されているサンプルSQL:

@ AcuDB..Batch(CompanyID、BranchID、Module、BatchNbr、CreditTotal、DebitTotal、ControlTotal、CuryCreditTotal、CuryDebitTotal、CuryControlTotal、CuryInfoID、LedgerID、BatchType、Status、AutoReverse、AutoReverseCopy、OrigModule、OrigBatchNbr、DateEntered、Releaに挿入LineCntr、CuryID、ScheduleID、NoteID、CreatedByID、CreatedByScreenID、CreatedDateTime、LastModifiedByID、LastModifiedByScreenID、LastModifiedDateTime、Hold、Description、Scheduled、Voided、FinPeriodID、TranPeriodID)select 2、1、Module、BatchNbr、CreditTotal 、CuryControlTotal、i.CuryInfoID、isnull((select a.LedgerID from @ AcuDB..ledger a where a.LedgerCD = b.LedgerID)、0)[LedgerID]、BatchType、Status、AutoReverse、AutoReverseCopy、OrigModule、OrigBatchNbr、DateEntered [DateEntered]、Released、Posted、LineCntr、b.CuryID、ScheduleID、NoteID、 'B5344897-037E-4D58-B5C3-1BDFD0F47BF9'[CreatedByID]、' 00000000'[CreatedByScreenID]、GETDATE()[CreatedDateTime]、' B5344897-037E-4D58-B5C3-1BDFD0F47BF9'[LastModifiedByID]、' 00000000'[LastModifiedBy GETDATE()[LastModifiedDateTime]、Hold、Description、Scheduled、Voided、b.FinPeriodID、TranPeriodID from Temp..ASI_GLBatch b inner join @ AcuDB..CurrencyInfo i on i.CuryEffDate = b.DateEntered cross join @ AcuDB..glsetup gここで、b.companyID=@CpnyCDおよびb.branchID=@BranchCDTemp..ASI_GLBatchからのTranPeriodIDb内部結合@AcuDB..CurrencyInfoi on i.CuryEffDate = b.DateEntered cross join @ AcuDB..glsetup gここで、b.companyID=@CpnyCDおよびb.branchID=@BranchCDTemp..ASI_GLBatchからのTranPeriodIDb内部結合@AcuDB..CurrencyInfoi on i.CuryEffDate = b.DateEntered cross join @ AcuDB..glsetup gここで、b.companyID=@CpnyCDおよびb.branchID=@BranchCD

4

1 に答える 1

0

このようにデータベース間を移動することは、SQL がコンテキストを暗示しようとする方法のために、常に不安定です。この場合、@AcuDBデータベースとスキーマの両方を含む完全修飾アドレスが含まれていない限り、コンテキストを切り替える方法が原因でエラーが発生します。何が含まれているかを読み取り@AcuDB、ストアド プロシージャでバッチを実行してみてください。必要に応じて、シナリオをサンドボックス化する別のインスタンスをセットアップします。これの C# 側は、少し切り取り、SQL が適切であることを確認するまで、事態を複雑にし続けます。問題がないことを確認したら、C# コードに統合し直して、そこから作業します。

于 2012-10-30T16:48:15.380 に答える