- PR -

ExecuteNonQuery の戻り値

投稿者投稿内容
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-03-23 11:34
お世話になっております。
System.Data.SqlClient.SqlCommandのExecuteNonQuery
で、Bulk insertを実行したところ、
想定した結果の2倍の値が返ってきてしまいます。

たとえば、100件のデータをbulk insert等で実行すると、
200という値が返されます。

実データを見ても100しか投入されていないし、
クエリアナライザから、直接実行した場合も、

(100 件処理されました)

となります。

これは、仕様なのでしょうか。
何かご存知の方いましたら、よろしくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-23 11:54
「影響を受けた行数」という事なので、選択行も含まれているのかな。
SELECT のみで試しに取得してみては?
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-23 12:03
引用:

囚人さんの書き込み (2006-03-23 11:54) より:

「影響を受けた行数」という事なので、選択行も含まれているのかな。
SELECT のみで試しに取得してみては?


SELECT は -1 で返される仕様ですよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-03-23 13:00
南部です。

変ですね。
こちらで確認したところ,正しい行数が返りましたが。

実行したSQLは次のものです。
コード:
bulk insert UserTable 
from 'd:\\work\\UserTable.txt' 
with (FIELDTERMINATOR = ',',ROWTERMINATOR = '\\n')


念の為、パケットも見てみましたが、DONEパケットにある行数も
正しい値ですのでサーバは正しい値を返してますね。

#もしかして、delete from 〜とかしてません?
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-03-23 13:05
引用:

nanbuさんの書き込み (2006-03-23 13:00) より:
南部です。

変ですね。
こちらで確認したところ,正しい行数が返りましたが。

実行したSQLは次のものです。
コード:
bulk insert UserTable 
from 'd:\work\UserTable.txt' 
with (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')


念の為、パケットも見てみましたが、DONEパケットにある行数も
正しい値ですのでサーバは正しい値を返してますね。

#もしかして、delete from 〜とかしてません?



そうなんです。サーバー側は正しい値を返しているようなんです。

こちらのスクリプトは、
bulk insert [UserTable]
from 'C:\hoge.dat'
with ( fieldterminator= ',' , formatfile= 'C:\hoge.fmt')


こんな感じです。
フォーマットファイルがだめなんでしょうか。
使わずにやってみます。

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-03-23 13:19
ヒント:トリガー
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2006-03-23 15:21
引用:

nanbuさんの書き込み (2006-03-23 13:00) より:
南部です。

変ですね。
こちらで確認したところ,正しい行数が返りましたが。

実行したSQLは次のものです。
コード:
bulk insert UserTable 
from 'd:\\work\\UserTable.txt' 
with (FIELDTERMINATOR = ',',ROWTERMINATOR = '\\n')


念の為、パケットも見てみましたが、DONEパケットにある行数も
正しい値ですのでサーバは正しい値を返してますね。

#もしかして、delete from 〜とかしてません?



やはり、フォーマットファイルなしでも、
倍の結果が返ってきてしまいました。
当然delete from 等はしていません。

よろしければ、
南部さんがうまくいっている
ソースを見せていただけないでしょうか。

私の実行しているソースは以下のようになっています。
コード:
string DBConnectionString = "hogehoge" ;
using (SqlConnection con = new SqlConnection(DBConnectionString)) 
{
	con.Open();
	System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
	command.Connection = con;
	command.CommandText = 
		@"bulk insert [UserTable] from 'C:\user.dat'  with  ( fieldterminator= ',')";
	int count = command.ExecuteNonQuery();
	return count;
} 




それから、トリガーですが、
単純にテーブルに対してのトリガーは明示的に設定はしていません。


nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-03-23 17:22
南部です。

同じソースですが、

[環境]
VisualStudio2005
SQLServer2005

コード:
using(SqlConnection con = new SqlConnection("接続文字列"))
{
  SqlCommand cmd = con.CreateCommand();
  cmd.CommandText = //改行してません
    @"bulk insert UserTable 
     from 'd:\work\UserTable.txt' 
     with (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')"; 
					
  con.Open();
  int cnt = cmd.ExecuteNonQuery();
  Console.WriteLine(cnt);
  con.Close();
}

//UserTable
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserTable](
	[UserID] [int] IDENTITY(1,1) NOT NULL,
	[UserName] [varchar](max) COLLATE Japanese_CI_AS NULL,
 CONSTRAINT [PK_UserTable] PRIMARY KEY CLUSTERED 
(
	[UserID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF  

//UserTable.txtの中身
1,aaa
2,bbb
3,ccc
4,ddd



これで、4が返りました。

スキルアップ/キャリアアップ(JOB@IT)