web-dev-qa-db-ja.com

C#でSQL関数を呼び出すにはどうすればよいですか?

SQLで関数を作成しましたが、C#アプリケーションでその関数を使用する必要があります。

このようなものを使用してみましたが、次のようになっているため、間違っているようです。

Must declare the scalar value '@2064734117'

...最初のパラメーターとして2064734117を指定し、2番目のパラメーターとして1を指定した場合。これが私が話しているコードです:

SqlConnection con = new SqlConnection(clsDb.connectionString);
string query = string.Format("select Function1(@{0},@{1}) ",
  int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1);
con.Open();
SqlCommand cmd = new SqlCommand(query,con);
SqlDataAdapter READER = new SqlDataAdapter();
READER.SelectCommand = cmd;
DataTable table = new DataTable();
READER.Fill(table);
radGridView1.DataSource = table;
con.Close();

そして、私の関数は2つの整数パラメーターを受け取り、テーブルを返します。 Visual Studioで確認したところ、機能しましたが、アプリケーションで機能させることができませんでした。

そしてこれは私の関数宣言です:

ALTER FUNCTION dbo.Function1
(
/*
@parameter1 int = 5,
@parameter2 datatype
*/
@ID int,
@clsTypeID int
)
    RETURNS TABLE/* @table_variable TABLE (column1 datatype, column2 datatype) */
    AS
         /*BEGIN */
    /* INSERT INTO @table_variable
       SELECT ... FROM ... */
RETURN SELECT  * FROM tblCLASS2 
        WHERE STNID = @ID AND CLASSTYPEID =  @clsTypeID  
/*END */
/*GO*/
7
Rika

SQLが少しずれている場合は、次のようになります。

  string query = string.Format("select * from dbo.Function1({0},{1});", int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1);

SQLインジェクションを防ぐためにSqlParameter-objectsを使用することをお勧めします。

  string query = "select * from dbo.Function1(@pa1,@par2);";
  cmd.Parameters.Add("@par1", SqlDbType.Int).Value = int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString());  
  cmd.Parameters.Add("@par2", SqlDbType.Int).Value = 1;
11
Mithrandir

一見すると、最初にわかるのは、オブジェクトの所有者/スキーマを指定していないということです。これは関数に必要なので、select dbo.Function1(...である必要があります

2番目:string.Formatへの呼び出しが生成するものを見てください。つまり、n別の整数に対して@1@nを生成していますが、そうではありません有効なパラメーター名です。これは便利です。

3番目:パラメータを追加しませんでした

4番目:(スカラーUDFではなく)テーブルUDFの場合、select * from dbo.Function1(...だけでなくselect dbo.Function1(...が必要です。

4
Marc Gravell

あなたはこのようなことをすることができます:

        myConn.Open();

        //generating the new command for our database
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT OBJECTID_1, NDNT as theAddress, MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) +")) from dbo.DWH_OUTPUT  GROUP BY OBJECTID_1,NDNT HAVING   (MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) + ")) = (Select MIN(ABS(a.x - " + double.Parse(x.ToString()) + ") + ABS(a.y - " + double.Parse(y.ToString()) + ")) from dbo.DWH_OUTPUT a ) )";
        cmd.Connection = myConn;

        //getting some more ado.net objects
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        da.SelectCommand = cmd;
        da.Fill(ds, @"Addresses");

        if (ds.Tables[0].Rows.Count > 0)
        {
            theAddress = ds.Tables[0].Rows[0][@"theAddress"] + @" (proximity address)";
        }

        myConn.Close();

この例では、SqlCommandのCommandTypeをCommandType.Textに設定していることに注意してください。コマンドパラメーター(つまり、コードスニペットのselect関数)を指定してから、データセットにFillメソッドを入力します。次に、標準のado.netで通常行うように、行から値を抽出できます。

ストアドプロシージャを呼び出す必要がある場合は、次を参照してください。

ado.netからTSQL関数を呼び出す方法

1
jdb1a1

所有者/スキーマ名を含む完全修飾関数名が必要です 次のリンクで利用可能な作業サンプル:

1
Munawar