QA@IT
«回答へ戻る

一部修正

1183
-C# 側のコードに問題があるのではないですか?
+C# 側のコードに問題があるのではないですか? アップされたコードはどう見ても変です。
 
-Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できました。
+Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できます。 
 
 ストアドプロシージャ
 

C# 側のコードに問題があるのではないですか? アップされたコードはどう見ても変です。

Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できます。 

ストアドプロシージャ

ALTER PROCEDURE dbo.Proce_GetID
    @tempID INT
    ,@RetID INT OUTPUT
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

        SELECT *  FROM Products WITH (TABLOCKX)

        SELECT @RetID = CategoryID FROM Products WHERE ProductID = @tempID

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
    END CATCH
END

C# 側のコード

protected int CreateDataSource(int id, DataTable table)
{
    string connString = "接続文字列";
    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand("dbo.Proce_GetID", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@tempID", id);

            SqlParameter param = new SqlParameter("@RetID", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            command.Parameters.Add(param);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader != null)
                {
                    table.Columns.Add(new DataColumn("ProductID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("ProductName", typeof(string)));
                    table.Columns.Add(new DataColumn("SupplierID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("UnitPrice", typeof(Decimal)));

                    while (reader.Read())
                    {
                        DataRow dr = table.NewRow();
                        dr["ProductID"] = (int)reader[0];
                        dr["ProductName"] = (string)reader[1];
                        dr["SupplierID"] = (int)reader[2];
                        dr["CategoryID"] = (int)reader[3];
                        dr["UnitPrice"] = (decimal)reader[5];
                        table.Rows.Add(dr);
                    }
                }
            }                

            // ストアドから取得した @RetID
            return (int)param.Value;
        }
    }
}
C# 側のコードに問題があるのではないですか? アップされたコードはどう見ても変です。

Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できます。 

ストアドプロシージャ

```
ALTER PROCEDURE dbo.Proce_GetID
    @tempID INT
    ,@RetID INT OUTPUT
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

        SELECT *  FROM Products WITH (TABLOCKX)

        SELECT @RetID = CategoryID FROM Products WHERE ProductID = @tempID

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
    END CATCH
END
```

C# 側のコード

```csharp
protected int CreateDataSource(int id, DataTable table)
{
    string connString = "接続文字列";
    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand("dbo.Proce_GetID", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@tempID", id);

            SqlParameter param = new SqlParameter("@RetID", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            command.Parameters.Add(param);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader != null)
                {
                    table.Columns.Add(new DataColumn("ProductID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("ProductName", typeof(string)));
                    table.Columns.Add(new DataColumn("SupplierID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("UnitPrice", typeof(Decimal)));
                        
                    while (reader.Read())
                    {
                        DataRow dr = table.NewRow();
                        dr["ProductID"] = (int)reader[0];
                        dr["ProductName"] = (string)reader[1];
                        dr["SupplierID"] = (int)reader[2];
                        dr["CategoryID"] = (int)reader[3];
                        dr["UnitPrice"] = (decimal)reader[5];
                        table.Rows.Add(dr);
                    }
                }
            }                
                
            // ストアドから取得した @RetID
            return (int)param.Value;
        }
    }
}
```

回答を投稿

C# 側のコードに問題があるのではないですか?

Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できました。

ストアドプロシージャ

ALTER PROCEDURE dbo.Proce_GetID
    @tempID INT
    ,@RetID INT OUTPUT
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

        SELECT *  FROM Products WITH (TABLOCKX)

        SELECT @RetID = CategoryID FROM Products WHERE ProductID = @tempID

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
    END CATCH
END

C# 側のコード

protected int CreateDataSource(int id, DataTable table)
{
    string connString = "接続文字列";
    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand("dbo.Proce_GetID", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@tempID", id);

            SqlParameter param = new SqlParameter("@RetID", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            command.Parameters.Add(param);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader != null)
                {
                    table.Columns.Add(new DataColumn("ProductID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("ProductName", typeof(string)));
                    table.Columns.Add(new DataColumn("SupplierID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("UnitPrice", typeof(Decimal)));

                    while (reader.Read())
                    {
                        DataRow dr = table.NewRow();
                        dr["ProductID"] = (int)reader[0];
                        dr["ProductName"] = (string)reader[1];
                        dr["SupplierID"] = (int)reader[2];
                        dr["CategoryID"] = (int)reader[3];
                        dr["UnitPrice"] = (decimal)reader[5];
                        table.Rows.Add(dr);
                    }
                }
            }                

            // ストアドから取得した @RetID
            return (int)param.Value;
        }
    }
}
C# 側のコードに問題があるのではないですか?

Microsoft のサンプルデータベース Northwind の Products テーブルを使った以外は全く同じストアドで、以下の C# のコードで取得できました。

ストアドプロシージャ

```
ALTER PROCEDURE dbo.Proce_GetID
    @tempID INT
    ,@RetID INT OUTPUT
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

        SELECT *  FROM Products WITH (TABLOCKX)

        SELECT @RetID = CategoryID FROM Products WHERE ProductID = @tempID

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
    END CATCH
END
```

C# 側のコード

```csharp
protected int CreateDataSource(int id, DataTable table)
{
    string connString = "接続文字列";
    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand("dbo.Proce_GetID", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@tempID", id);

            SqlParameter param = new SqlParameter("@RetID", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            command.Parameters.Add(param);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader != null)
                {
                    table.Columns.Add(new DataColumn("ProductID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("ProductName", typeof(string)));
                    table.Columns.Add(new DataColumn("SupplierID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
                    table.Columns.Add(new DataColumn("UnitPrice", typeof(Decimal)));
                        
                    while (reader.Read())
                    {
                        DataRow dr = table.NewRow();
                        dr["ProductID"] = (int)reader[0];
                        dr["ProductName"] = (string)reader[1];
                        dr["SupplierID"] = (int)reader[2];
                        dr["CategoryID"] = (int)reader[3];
                        dr["UnitPrice"] = (decimal)reader[5];
                        table.Rows.Add(dr);
                    }
                }
            }                
                
            // ストアドから取得した @RetID
            return (int)param.Value;
        }
    }
}
```