0

C# を使用して Sql-Server データベースにデータを挿入しようとしています。ストアド プロシージャを呼び出していますが、それを追加したいと考えています。どのような変更を行うべきかわかりませんが、最終的にはストアド プロシージャで行いたいと考えています。

私のストアドプロシージャは今:

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @TagID int, 
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
IF NOT EXISTS (SELECT NULL FROM Tag
                WHERE @TagID = @TagID)
BEGIN
    INSERT INTO 
        Tag 
        (TagID,Value,TagCount) 
        VALUES 
        (@TagID,@Value,@TagCount)
END

そして私のC#コード:

int TagID = int.Parse(txtTagID.Text); //This should fall away so auto increment.
            String Value = txtValue.Text;
            int TagCount = int.Parse(txtCount.Text); 

            using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
            using (var cmd = conn.CreateCommand())
            {
                    conn.Open();
                    cmd.CommandText = "InsertTagProcdure";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@TagID", TagID);
                    cmd.Parameters.AddWithValue("@Value", Value);
                    cmd.Parameters.AddWithValue("@TagCount", TagCount);
                    cmd.ExecuteNonQuery();
                }

私が使用したテーブル作成: // これは、上司から渡されたものであり、変更できません。

CREATE TABLE [dbo].[Tag](
    [TagID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL,
 CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED 
(
    [TagID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
4

4 に答える 4

4

理想的には、テーブル定義を変更して TagID を ID フィールドにするだけです。それができない場合、次善の策は次のとおりです。

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    BEGIN TRANSACTION
        DECLARE @TagID int;
        SELECT @TagID = coalesce((select max(TagID) + 1 from Tag), 1)
    COMMIT      
    INSERT INTO 
        Tag 
        (TagID,Value,TagCount) 
        VALUES 
        (@TagID,@Value,@TagCount)
END

トランザクションは、一意の TagID で終わらないことを保証し、合体は、テーブルが空で初期値 1 を与える特殊なケースを処理します。

編集:

元の質問への変更に基づいて、テーブルには既に ID 列があるため、ストアド プロシージャは次のようになります。

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    INSERT INTO Tag (Value,TagCount) VALUES (@Value,@TagCount)
END

あなたのC#コードは

int TagID = int.Parse(txtTagID.Text); //これはなくなるはずなので、自動インクリメントします。文字列値 = txtValue.Text; int TagCount = int.Parse(txtCount.Text);

        using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
        using (var cmd = conn.CreateCommand())
        {
                conn.Open();
                cmd.CommandText = "InsertTagProcdure";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Value", Value);
                cmd.Parameters.AddWithValue("@TagCount", TagCount);
                cmd.ExecuteNonQuery();
            }
于 2012-05-16T08:12:11.710 に答える
1

ID プロパティを使用するようにタグ テーブルを設定します。ここを参照してください: http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx .

次に、プロシージャ、プロシージャ内の挿入ステートメント、および C# コードから TagId を削除できます。

すると、次のようになります。

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    INSERT INTO 
        Tag 
        (Value,TagCount) 
        VALUES 
        (@Value,@TagCount)
END

C# コード:

            String Value = txtValue.Text;
            int TagCount = int.Parse(txtCount.Text); 

            using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
            using (var cmd = conn.CreateCommand())
            {
                    conn.Open();
                    cmd.CommandText = "InsertTagProcdure";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Value", Value);
                    cmd.Parameters.AddWithValue("@TagCount", TagCount);
                    cmd.ExecuteNonQuery();
                }
于 2012-05-16T08:10:26.133 に答える
1

同じ値を比較しているため、ステートメント WHERE @TagID = @TagID は常に true になります。これを探していると思います(TagID が AUTO-ID フィールドであると仮定します)。

CREATE PROCEDURE [dbo].[InsertTagProcdure] 
       @TagID int,  
       @Value nvarchar(200),  
       @TagCount nvarchar(200)  
AS 
BEGIN
IF NOT EXISTS (SELECT TagID FROM Tag WHERE TagID = @TagID) 
BEGIN 
    INSERT INTO  
        Tag  
        (Value,TagCount)  
        VALUES  
        (@Value,@TagCount) 
  SET @TagID = @@IDENTITY
END 
ELSE
BEGIN
  UPDATE Tag
    SET Value=@Value,
    TagCount=@TagCount
  WHERE TagID = @TagID
END
RETURN @TagID
END
于 2012-05-16T08:10:36.820 に答える
0

適切な列で SQL Server の「ID 仕様」を有効にする必要があります。テーブル デザイン モードに移動し、列を選択すると、下部のプロパティ画面に「ID 仕様」というプロパティがあります。

その後、ストアド プロシージャで TagId を省略できます。Sql Server は自動的に ID を新しいレコードに割り当てます。

新しく挿入された ID を知りたい場合 (次の質問だと思います)、ストアド プロシージャで関数 SCOPE_IDENTITY() を使用すると、新しく挿入されたレコードの ID が返されます。

于 2012-05-16T08:11:24.273 に答える