C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ストアドプロシージャ


(過去ログ 121 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■72292 / inTopicNo.1)  ストアドプロシージャ
  
□投稿者/ しーちゃん (1回)-(2014/06/02(Mon) 16:47:37)

分類:[データベース全般] 

2014/06/03(Tue) 11:31:01 編集(投稿者)

ストアド未経験者なのですが、C#でアプリを作っているのですが、ストアドプロシージャを使ってInsertしたいのです。
どの機能に対してトランザクションログを保存するかは、検討中なのですが、ID(連番)、ActionType、SQL、Program(ストアド名)に必要なパラメーターを渡してInsert(登録)してあげたいので すが、どうすれば良いのでしょうか?
以下のように誰がいつどのような処理を行ったのかログに保存して、テーブルに登録したいです。
ID(連番)
1
ActionType
I(insert)
SQL
insert into User(User_ID,User_Group) values (shion,test)
Program
ストアド名を入れたいです(※:SQL実行ストアド名称)

どこの機能で障害が発生しているかわかるようにするためストアド名を入れたいです。
CreationDate
Insert日時※GETDATE()関数を使う?

説明不足または、きちんと伝わっているか不安ですが、ご教授のほど宜しくお願いしますm(__)m

引用返信 編集キー/
■72293 / inTopicNo.2)  Re[1]: ストアドプロシージャ
□投稿者/ shu (576回)-(2014/06/02(Mon) 17:08:00)
No72292 (しーちゃん さん) に返信

> ID(連番)、ActionType、SQL、Program(ストアド名)に必要なパラメーターを渡してInsert(登録)してあげたいので すが、どうすれば良いのでしょうか?
これらを引数として受ける関数でも作ってそのなかでストアドの実行とInsertを行えばよいのではないでしょうか?

引用返信 編集キー/
■72295 / inTopicNo.3)  Re[1]: ストアドプロシージャ
□投稿者/ WebSurfer (272回)-(2014/06/02(Mon) 17:45:22)
No72292 (しーちゃん さん) に返信

データベースは何でしょう?

データーベースは SQL Server で、パラメータを受け取って INSERT するストアドは完成済みで
それを使って INSERT 操作を行う C# のプログラムの書き方を質問していると想像して・・・

以下のページの「SqlCommand およびストアド プロシージャでのパラメーターの使用」のセクシ
ョンが参考になりませんか?

パラメーターおよびパラメーターのデータ型の構成
http://msdn.microsoft.com/ja-jp/library/yy6y35y8(v=vs.110).aspx

引用返信 編集キー/
■72305 / inTopicNo.4)  Re[2]: ストアドプロシージャ
□投稿者/ しーちゃん (2回)-(2014/06/03(Tue) 10:22:56)
shuさん

アドバイスありがとうございます。
引数として受ける関数でも作ってそのなかでストアドの実行とInsertを行えばよいと回答いただきましたが、まさにその通りに行いたいのですが、調べ方がよくないのかなかなか出てこなくて。。
何か参考になるサイトやサンプルがございましたらご教授お願いします。

データーベースは SQL Serverです。
パラメータを受け取って INSERT するストアドはまだ未完成です。


No72293 (shu さん) に返信
> ■No72292 (しーちゃん さん) に返信
>
>>ID(連番)、ActionType、SQL、Program(ストアド名)に必要なパラメーターを渡してInsert(登録)してあげたいので すが、どうすれば良いのでしょうか?
> これらを引数として受ける関数でも作ってそのなかでストアドの実行とInsertを行えばよいのではないでしょうか?
>
引用返信 編集キー/
■72306 / inTopicNo.5)  Re[3]: ストアドプロシージャ
□投稿者/ WebSurfer (274回)-(2014/06/03(Tue) 10:49:26)
No72305 (しーちゃん さん) に返信
> パラメータを受け取って INSERT するストアドはまだ未完成です。

どこまで自分でできていて、どこで問題どのような問題に遭遇して前に進め
ないのですか?

それとも何もできてないからゼロから手取り足取り教えてほしいということ
ですか?
引用返信 編集キー/
■72308 / inTopicNo.6)  Re[2]: ストアドプロシージャ
□投稿者/ しーちゃん (3回)-(2014/06/03(Tue) 11:08:24)
WebSurferさん

お忙しい中でのアドバイスをいただきましてありがとうございます。
INSERT するストアドはまだ未完成です。

下記のURLから参考にさせてもらって、
テーブル値パラメーター型の作成はできているのですが、
CREATE TABLE [dbo].[TestTable] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[ActionType] NVARCHAR (50) NULL,
[SQL] NVARCHAR (100) NULL,
[User] NVARCHAR (50) NULL,
[WorkStation] NVARCHAR (50) NULL,
[Program] NVARCHAR (50) NULL,
[CreationDate] NVARCHAR (50) NULL,
[LastModifiedDate] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

INSERT を実行するためにパラメーターを受取ってのどのようなINSERT文を作ればよいのでしょうか?

INSERT INTO [dbo].[TestTable] (Id, ActionType, SQL, User, WorkStation, Program, CreationDate, LastModifiedDate)
SELECT 〜 FROM 〜;




No72295 (WebSurfer さん) に返信
> ■No72292 (しーちゃん さん) に返信
>
> データベースは何でしょう?
>
> データーベースは SQL Server で、パラメータを受け取って INSERT するストアドは完成済みで
> それを使って INSERT 操作を行う C# のプログラムの書き方を質問していると想像して・・・
>
> 以下のページの「SqlCommand およびストアド プロシージャでのパラメーターの使用」のセクシ
> ョンが参考になりませんか?
>
> パラメーターおよびパラメーターのデータ型の構成
> http://msdn.microsoft.com/ja-jp/library/yy6y35y8(v=vs.110).aspx
>
引用返信 編集キー/
■72309 / inTopicNo.7)  Re[3]: ストアドプロシージャ
□投稿者/ WebSurfer (276回)-(2014/06/03(Tue) 13:51:26)
No72308 (しーちゃん さん) に返信
> INSERT を実行するためにパラメーターを受取ってのどのようなINSERT文を作ればよいのでしょうか?
>
> INSERT INTO [dbo].[TestTable] (Id, ActionType, SQL, User, WorkStation, Program, CreationDate, LastModifiedDate)

「ストアドプロシージャ」「引数」などをキーワードに検索すると参考になるページが
見つかると思いますので、まずは自助努力でストアドを作ってみてください。

注:Id は Identity なので INSERT できません。
引用返信 編集キー/
■72310 / inTopicNo.8)  Re[4]: ストアドプロシージャ
□投稿者/ しーちゃん (4回)-(2014/06/03(Tue) 15:42:18)
WebSurfer さん

度々すいません。
自力で作ってはみたものの以下のプロシージャを実行してパラメータの値を入力しても、

CREATE PROCEDURE [dbo].[TestProcedure]
@Id int,
@ActionType nvarchar(50),
@SQLTEST nvarchar(100),
@UserTest nvarchar(50),
@WorkStation nvarchar(50),
@Program nvarchar(50),
@CreationDate nvarchar(50),
@LastModifiedDate nvarchar(50)
WITH EXECUTE AS OWNER
AS
--Declare @Id int
Begin

select @Id = a.maxid
from
(
select max([Id]) as maxid
from [TestTable]
) a

insert into TestTable values
(@Id + 1,@ActionType,@SQLTEST,@UserTest,@WorkStation,'AutoSQL',getdate(),getdate())

End

以下のN'〜'が赤字で表示されメッセージ欄に、
(1 行処理されました)

メッセージ 515、レベル 16、状態 2、プロシージャ TestProcedure、行 24
Cannot insert the value NULL into column 'Id', table 'BBJTRANTEST.dbo.TestTable'; column does not allow nulls. INSERT fails.
The statement has been terminated.
と表示されて1 行処理されたはずの更新ができないのですが、
自力では今の段階だとこのような状態です。

何がいけませんでしょうか?
また、参考になる検索方法を教えていただきましてありがとうございます。


引用返信 編集キー/
■72312 / inTopicNo.9)  Re[5]: ストアドプロシージャ
□投稿者/ shu (578回)-(2014/06/03(Tue) 16:24:34)
No72310 (しーちゃん さん) に返信

> メッセージ 515、レベル 16、状態 2、プロシージャ TestProcedure、行 24
> Cannot insert the value NULL into column 'Id', table 'BBJTRANTEST.dbo.TestTable'; column does not allow nulls. INSERT fails.
> The statement has been terminated.
'BBJTRANTEST.dbo.TestTable'テーブルの'Id'列にNullを挿入うすることは出来ません。
列(Id)はNULLを許容していません。
挿入は失敗しました。
引数@IDに渡したのがNullだったのではないでしょうか?書き換え可能の指定(OUT)をしないと
ストアド内で引数の値を変更することは出来ません。
また既出ですが、IDENTITY指定されている列はオプションを変更しないと挿入できません。(SET IDENTITY_INSERT)


提示コードからするとID列への挿入は必要ないので

Insert into <テーブル名>
(挿入列1,挿入列2, ... , 挿入列n)
Values
(値1,値2, ... , 値n)

のように列指定をしてID列を明示的に除外した方がよいと思います。

引用返信 編集キー/
■72313 / inTopicNo.10)  Re[5]: ストアドプロシージャ
□投稿者/ WebSurfer (278回)-(2014/06/03(Tue) 16:26:02)
No72310 (しーちゃん さん) に返信

先のレスで「Id は Identity なので INSERT できません。」と書いたことを理解されているでしょうか?

DB 側で自動的に裁判して INSERT されるので、ユーザーが値を指定して INSERT クエリに含めるものでは
ないのです。

従って、INSERT クエリの中の @id + 1 は不要です。(当然その上の @Id, int の宣言や、select @Id=...
等も不要です)

あと、Identity の話とは関係ないですが、テーブルのスキーマ(特に CreationDate や LastModifiedDate
フィールドの型)を見直したほうがいいです。


Identity に関して以下の記事にいろいろ参考になることが書いてあって興味深いと思いますので、時間が
あったら読んでみることをお勧めします。

@@IDENTITY クライシスを管理する
http://msdn.microsoft.com/ja-jp/library/ms971502.aspx

引用返信 編集キー/
■72314 / inTopicNo.11)  Re[6]: ストアドプロシージャ
□投稿者/ しーちゃん (5回)-(2014/06/03(Tue) 16:51:19)
shuさん

度々アドバイスいただきましてありがとうございます。
ご指摘通りに引数@IDに渡したのがNullだったようです。

こんな私に丁寧なアドバイスいただいたことに感謝してもしきれないです。。

後は、IDENTITY指定されている列はオプションを変更しないと挿入できません。(SET IDENTITY_INSERT)を、試してみたいと思います☆

また、基本的なことかもしれませんが、実行結果でSQLQuery1.sqlで以下の、
SELECT @return_value as 'Return Value'って何のための戻り値なのでしょうか?
実行結果は、いつも0なので不思議な感覚です。

◆実行結果です
ID(連番)
1

ActionType
I(Insert)

SQLTEST
insert into User(User_ID,User_Group) values (shiori,test)

UserTest
ushiori

WorkStation
Computer Name

Program
AutoSQL

CreationDate
Jun 3 2014 4:30PM
LastModifiedDate
Jun 3 2014 4:30PM




No72312 (shu さん) に返信
> ■No72310 (しーちゃん さん) に返信
>
>>メッセージ 515、レベル 16、状態 2、プロシージャ TestProcedure、行 24
>>Cannot insert the value NULL into column 'Id', table 'BBJTRANTEST.dbo.TestTable'; column does not allow nulls. INSERT fails.
>>The statement has been terminated.
> 'BBJTRANTEST.dbo.TestTable'テーブルの'Id'列にNullを挿入うすることは出来ません。
> 列(Id)はNULLを許容していません。
> 挿入は失敗しました。
> 引数@IDに渡したのがNullだったのではないでしょうか?書き換え可能の指定(OUT)をしないと
> ストアド内で引数の値を変更することは出来ません。
> また既出ですが、IDENTITY指定されている列はオプションを変更しないと挿入できません。(SET IDENTITY_INSERT)
>
>
> 提示コードからするとID列への挿入は必要ないので
>
> Insert into <テーブル名>
> (挿入列1,挿入列2, ... , 挿入列n)
> Values
> (値1,値2, ... , 値n)
>
> のように列指定をしてID列を明示的に除外した方がよいと思います。
>
引用返信 編集キー/
■72315 / inTopicNo.12)  Re[6]: ストアドプロシージャ
□投稿者/ しーちゃん (6回)-(2014/06/03(Tue) 17:34:48)
WebSurferさん

丁寧なアドバイスをいただきましていつもありがとうございます。
自動採番を先ほど調べていまして、
レスを見たら回答くださっていたのでありがとうございます。
@id + 1 が余計なことをしていたので関連するものをすべてコメントアウトしていたら、
きちんと理解せずにできてしまったので助かりました☆

教えていただいた。@@IDENTITY クライシスを管理するを、
時間があるときにじっくりと読んで理解してみようと思います。


No72313 (WebSurfer さん) に返信
> ■No72310 (しーちゃん さん) に返信
>
> 先のレスで「Id は Identity なので INSERT できません。」と書いたことを理解されているでしょうか?
>
> DB 側で自動的に裁判して INSERT されるので、ユーザーが値を指定して INSERT クエリに含めるものでは
> ないのです。
>
> 従って、INSERT クエリの中の @id + 1 は不要です。(当然その上の @Id, int の宣言や、select @Id=...
> 等も不要です)
>
> あと、Identity の話とは関係ないですが、テーブルのスキーマ(特に CreationDate や LastModifiedDate
> フィールドの型)を見直したほうがいいです。
>
>
> Identity に関して以下の記事にいろいろ参考になることが書いてあって興味深いと思いますので、時間が
> あったら読んでみることをお勧めします。
>
> @@IDENTITY クライシスを管理する
> http://msdn.microsoft.com/ja-jp/library/ms971502.aspx
>
引用返信 編集キー/
■72316 / inTopicNo.13)  Re[7]: ストアドプロシージャ
□投稿者/ しーちゃん (7回)-(2014/06/03(Tue) 19:01:36)
2014/06/04(Wed) 09:44:30 編集(投稿者)
2014/06/04(Wed) 09:42:11 編集(投稿者)

shuさん

度々ごめんなさい。もう一つ教えてください。
お陰様でこれを取得できれば完成なのですが、
関数でマシン名の取得について教えてください。
今のストアド実行時には下記のように記載していますが、
実行結果がどうしても上手くいきません。
WorkStationのカラムには、空白が入ってしまいます。
本来の実行結果は、WorkStationのカラムには、取得したマシン名。
WorkStationのカラムには、関数から取得したマシン名を入れたいのですが。。

CREATE PROCEDURE [dbo].[TestProcedure]
--@Id int,
@ActionType nvarchar(50),
@SQLTEST nvarchar(100),
@UserTest nvarchar(50)
--@WorkStation nvarchar(50)
--@Program nvarchar(50),
--@CreationDate nvarchar(50),
--@LastModifiedDate nvarchar(50)
WITH EXECUTE AS OWNER
AS

Begin

--select OBJECT_SCHEMA_NAME()
--SELECT HOST_NAME()

insert into TestTable values
(@ActionType,@SQLTEST,@UserTest,HOST_NAME(),OBJECT_NAME(@@PROCID) ,getdate(),getdate())

End
◆実行結果です
ID(連番)
1

ActionType
I(Insert)

SQLTEST
insert into User(User_ID,User_Group) values (shiori,test)

UserTest
ushiori

WorkStation
※空白になってしまいます。

Program
ストアド名(取得済み)

CreationDate
Jun 3 2014 4:30PM
LastModifiedDate
Jun 3 2014 4:30PM


引用返信 編集キー/
■72317 / inTopicNo.14)  Re[7]: ストアドプロシージャ
□投稿者/ しーちゃん (8回)-(2014/06/03(Tue) 19:02:41)
2014/06/04(Wed) 09:43:35 編集(投稿者)

WebSurferさん

度々ごめんなさい。もう一つ教えてください。
お陰様でこれを取得できれば完成なのですが、
関数でマシン名の取得について教えてください。
今のストアド実行時には下記のように記載していますが、
実行結果がどうしても上手くいきません。
WorkStationのカラムには、空白が入ってしまいます。
本来の実行結果は、WorkStationのカラムには、取得したマシン名。
WorkStationのカラムには、関数から取得したマシン名を入れたいのですが。。

CREATE PROCEDURE [dbo].[TestProcedure]
--@Id int,
@ActionType nvarchar(50),
@SQLTEST nvarchar(100),
@UserTest nvarchar(50)
--@WorkStation nvarchar(50)
--@Program nvarchar(50),
--@CreationDate nvarchar(50),
--@LastModifiedDate nvarchar(50)
WITH EXECUTE AS OWNER
AS

Begin

--select OBJECT_SCHEMA_NAME()
--SELECT HOST_NAME()

insert into TestTable values
(@ActionType,@SQLTEST,@UserTest,HOST_NAME(),OBJECT_NAME(@@PROCID) ,getdate(),getdate())

End
◆実行結果です
ID(連番)
1

ActionType
I(Insert)

SQLTEST
insert into User(User_ID,User_Group) values (shiori,test)

UserTest
ushiori

WorkStation
※空白になってしまいます。

Program
ストアド名(取得済み)

CreationDate
Jun 3 2014 4:30PM
LastModifiedDate
Jun 3 2014 4:30PM


引用返信 編集キー/
■72318 / inTopicNo.15)  Re[8]: ストアドプロシージャ
□投稿者/ WebSurfer (279回)-(2014/06/03(Tue) 19:57:33)
No72317 (しーちゃん さん) に返信

ストアドで目的のデータが取得できない理由は分かりません。質問者さんの特殊事情などの
理由があるのかもしれません(それは回答者には分かりません)。

一番最初の質問で、

> C#でアプリを作っているのですが

とありましたので、C# のコードで取得して、それからパラメータとして渡してはいかがで
すか?
引用返信 編集キー/
■72323 / inTopicNo.16)  Re[9]: ストアドプロシージャ
□投稿者/ しーちゃん (9回)-(2014/06/04(Wed) 10:09:48)
WebSurferさん

いつもアドバイスありがとうございます。
たまにおかしなデータが取得されたりしていたので、
質問してしまいました。。

テーブルデザインのデータ型を途中で変更したら、
WorkStationのカラムには、空白が取得されたり、
Idのカラムには今まで採番されてインクリメントされていた値が、
一ケタからいきなり1000番台に採番されたりとパニックになってしまい、ん?て思って変な質問してしまいました。

◆取得結果マシン名を取得ができましたが、採番がおかしいです。
CREATE PROCEDURE [dbo].[TestProcedure]
@ActionType nvarchar(50),
@SQLTEST nvarchar(MAX),
@UserTest nvarchar(30)

WITH EXECUTE AS OWNER
AS
--Declare @Program nvarchar(30)
Begin

--select OBJECT_SCHEMA_NAME(@@PROCID)

insert into TestTable values
(@ActionType,@SQLTEST,@UserTest,HOST_NAME(),OBJECT_NAME(@@PROCID),getdate(),getdate())

End


引き続き、これからC# のコードで取得して、それからパラメータとして渡してみます。
引用返信 編集キー/
■72324 / inTopicNo.17)  Re[8]: ストアドプロシージャ
□投稿者/ しーちゃん (10回)-(2014/06/04(Wed) 10:13:58)
shuさん

いつもアドバイスありがとうございます。
上記の質問でマシン名の取得には成功しました。
たまにおかしなデータが取得されたりしていたので、
質問してしまいました。。ごめんなさい。

テーブルデザインのデータ型を途中で変更したら、
WorkStationのカラムには、空白が取得されたり、
Idのカラムには今まで採番されてインクリメントされていた値が、
一ケタからいきなり1000番台に採番されたりとパニックになってしまい、ん?て思って変な質問してしまいました。

◆取得結果マシン名を取得ができましたが、採番がおかしいです。
CREATE PROCEDURE [dbo].[TestProcedure]
@ActionType nvarchar(50),
@SQLTEST nvarchar(MAX),
@UserTest nvarchar(30)

WITH EXECUTE AS OWNER
AS
--Declare @Program nvarchar(30)
Begin

--select OBJECT_SCHEMA_NAME(@@PROCID)

insert into TestTable values
(@ActionType,@SQLTEST,@UserTest,HOST_NAME(),OBJECT_NAME(@@PROCID),getdate(),getdate())

End

引用返信 編集キー/
■72325 / inTopicNo.18)  Re[9]: ストアドプロシージャ
□投稿者/ しーちゃん (11回)-(2014/06/04(Wed) 13:35:50)
No72324 (しーちゃん さん) に返信
> shuさん
>
> いつもアドバイスありがとうございます。
> 上記の質問でマシン名の取得には成功しました。
> たまにおかしなデータが取得されたりしていたので、
> 質問してしまいました。。ごめんなさい。
>
> テーブルデザインのデータ型を途中で変更したら、
> WorkStationのカラムには、空白が取得されたり、
> Idのカラムには今まで採番されてインクリメントされていた値が、
> 一ケタからいきなり1000番台に採番されたりとパニックになってしまい、ん?て思って変な質問してしまいました。
>
> ◆取得結果マシン名を取得ができましたが、採番がおかしいです。
> CREATE PROCEDURE [dbo].[TestProcedure]
> @ActionType nvarchar(50),
> @SQLTEST nvarchar(MAX),
> @UserTest nvarchar(30)
>
> WITH EXECUTE AS OWNER
> AS
> --Declare @Program nvarchar(30)
> Begin
>
> --select OBJECT_SCHEMA_NAME(@@PROCID)
>
> insert into TestTable values
> (@ActionType,@SQLTEST,@UserTest,HOST_NAME(),OBJECT_NAME(@@PROCID),getdate(),getdate())
>
> End
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -