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*/
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;
一見すると、最初にわかるのは、オブジェクトの所有者/スキーマを指定していないということです。これは関数に必要なので、select dbo.Function1(...
である必要があります
2番目:string.Format
への呼び出しが生成するものを見てください。つまり、n
別の整数に対して@1
と@n
を生成していますが、そうではありません有効なパラメーター名です。これは便利です。
3番目:パラメータを追加しませんでした
4番目:(スカラーUDFではなく)テーブルUDFの場合、select * from dbo.Function1(...
だけでなくselect dbo.Function1(...
が必要です。
あなたはこのようなことをすることができます:
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で通常行うように、行から値を抽出できます。
ストアドプロシージャを呼び出す必要がある場合は、次を参照してください。
所有者/スキーマ名を含む完全修飾関数名が必要です 次のリンクで利用可能な作業サンプル: