7

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

私はこのようなものを使ってみましたが、私が得ているので間違っているようです:

Must declare the scalar value '@2064734117'

...2064734117最初のパラメーターと12番目のパラメーターとして与える場合。これが私が話しているコードです:

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*/
4

4 に答える 4

12

あなたのSQLは少しずれています。次のようにする必要があります。

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

SqlParameter-objects を使用して、SQL インジェクションを防ぐことができます。

  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;
于 2012-08-03T13:25:43.960 に答える
4

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

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

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

4 番目: テーブル UDF (スカラー UDF ではなく) の場合select * from dbo.Function1(...select dbo.Function1(...

于 2012-08-03T13:24:38.110 に答える
1

次のようなことができます。

        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 関数を呼び出す方法

于 2012-08-03T13:23:39.590 に答える
1

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

于 2012-08-03T13:24:40.210 に答える