質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2176閲覧

C# ストアド実行時に"着信の表形式のデータ ストリーム (TDS) リモート プロシージャ呼び出し (RPC) プロトコル ストリームが不適切です。RPC 名が無効です。"となる

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/12/26 02:57

using (SqlConnection conn = DBLibrary.CreateConnection()) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); using (SqlCommand command = conn.CreateCommand()) { try { command.Connection = conn; command.Transaction = transaction; StringBuilder sb = new StringBuilder(); sb.Append("SET NOCOUNT ON; "); //sb.Append("DECLARE @TargetTableName sysname "); //sb.Append("DECLARE @DailyString nvarchar(1024) "); //sb.Append("DECLARE @TotalSqlString nvarchar(1024) "); //sb.Append("DECLARE @ParmDefinition nvarchar(100) "); sb.Append("DECLARE TargetTables CURSOR FOR "); sb.Append("SELECT TABLE_NAME "); sb.Append("FROM INFORMATION_SCHEMA.TABLES "); sb.Append("WHERE"); sb.Append("(TABLE_NAME like '%DailyTotal') "); sb.Append("AND TABLE_TYPE = 'BASE TABLE' "); sb.Append("OPEN TargetTables "); sb.Append("FETCH NEXT FROM TargetTables INTO @TargetTableName "); sb.Append("WHILE @@FETCH_STATUS = 0 "); sb.Append("BEGIN "); sb.Append("SET @DailyString = 'DELETE FROM ' + '[' + @TargetTableName + ']'"); sb.Append("SET @TotalSqlString = 'DELETE FROM ' + '[' + REPLACE(@TargetTableName, 'DailyTotal', 'Total') + ']'"); sb.Append("PRINT @DailyString "); sb.Append("EXEC sp_executesql @DailyString "); sb.Append("PRINT @TotalSqlString "); sb.Append("EXEC sp_executesql @TotalSqlString "); sb.Append("FETCH NEXT FROM TargetTables INTO @TargetTableName "); sb.Append("END "); sb.Append("CLOSE TargetTables "); sb.Append("DEALLOCATE TargetTables"); command.Parameters.Add(new SqlParameter("@TargetTableName", System.Data.SqlDbType.NVarChar, 128)); command.Parameters.Add(new SqlParameter("@DailyString", System.Data.SqlDbType.NVarChar,1024)); command.Parameters.Add(new SqlParameter("@TotalSqlString", System.Data.SqlDbType.NVarChar, 1024)); command.Parameters.Add(new SqlParameter("@ParmDefinition", System.Data.SqlDbType.NVarChar, 100)); command.CommandText = sb.ToString(); command.CommandType = System.Data.CommandType.StoredProcedure; command.ExecuteNonQuery(); transaction.Commit(); } catch(Exception ex) { transaction.Rollback(); } } }

上記を実行するとcommand.ExecuteNonQuery();実行後に
"着信の表形式のデータ ストリーム (TDS) リモート プロシージャ呼び出し (RPC) プロトコル ストリームが不適切です。RPC 名が無効です。"

とエラーになってしまいます。
どういう状態なのでしょうか?解決策を教えてください。

//sb.Append("DECLARE @TargetTableName sysname ");以下のコメント状態から解除して
command.Parameters.Add(...をコメントにした常態にしてできたSQL文をManageMentStudioで流すとエラーにはならないです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

貴方が書いているストアドっぽいものはストアドプロシージャでもSQLコマンドでもありません。
ストアドプロシージャはDBMSに"CREATE PROCEDURE"で登録してから登録した名前で呼び出して使います。
もしストアドプロシージャを登録したいのならそのコードをちょっといじるだけで行けそうです。
ただし StringBuilder はクエリを動的に組み立てるときは便利ですが、それ以外で使うと見づらくなって遅くなります。

投稿2017/12/26 03:27

編集2017/12/26 03:28
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/26 03:47

もともとストアドで呼び出されていたものを訳あって上記のように記述したいのです。
hihijiji

2017/12/26 03:51

でしたら、 command.CommandType = System.Data.CommandType.StoredProcedure は変ですよね?
退会済みユーザー

退会済みユーザー

2017/12/26 04:00

すみません。割とつまらないミスですね。 自分の確認不足でした。ありがとうございました。
guest

0

ベストアンサー

実行しようとしているのはストアドプロシージャではないので、

c#

1 command.CommandType = System.Data.CommandType.StoredProcedure;

c#

1 command.CommandType = System.Data.CommandType.Text;

としたほうがよさそうです。

※以下は直接の回答ではありません
StringBuilder を使ってSQL文を組み上げるなら、Append よりも AppendLine のほうが便利です。
行末に改行を補ってくれるので、「文字列末端に空白いれるの忘れた!」で起きる無駄なクエリエラーを防げます。
また、今回のケースのように毎回同じ文字列のクエリを実行するのであれば、StringBuilder を使わずともよいのではないでしょうか。

c#

1command.CommandText = @" 2 SET NOCOUNT ON; 3 4 DECLARE TargetTables CURSOR FOR 5 SELECT TABLE_NAME 6/* (以下略) */ 7";

投稿2017/12/26 03:57

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問