- 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が返りました。
|