0

C# で値を取得しようとすると常に null を返す SQL 関数の何が問題になっていますか? 関数は SQL デザイナでかなり安定して動作しますが、C# を使用して実行しようとすると失敗します。

これは私の関数定義です。最初のテーブル値関数:

ALTER FUNCTION dbo.FGetNumberOfChikensInThisDate
    (
    @Date nvarchar(12),
    @IDSource bigint
    )
RETURNS Table 
AS
    RETURN SELECT     SUM(NumberOfChicken) AS Number of Chickens  
       FROM            tblChickens
           WHERE        (SourceID= @IDSource) AND (ReservedDate = @Date)

そして、これはスカラー値関数です:

ALTER FUNCTION dbo.FSGetNumberOfChikensInThisDate
    (
    @Date nvarchar(12),
    @IDSource bigint
    )
RETURNS bigint
AS
 BEGIN
  DECLARE  @ret bigint;
   SELECT      @ret=  SUM(NumberOfChicken) 
       FROM            tblChickens
          WHERE        (ReserveDate = @Date) AND (SourceID= @IDSource)
RETURN @ret;
END;

これら 2 つの方法を使用して、これらの関数の SQL コマンド文字列を作成し、パラメーターを渡して C# から実行します。

public static DataTable ExecuteSqlFunction(string functionName, string[] Functionparamers)
        {
            SqlDataAdapter reader = new SqlDataAdapter();
            DataTable table = new DataTable();
            string query = "select * from " + functionName + "(";
            int index = 0;
            foreach (string item in Functionparamers)//{0},{0}
            {
                query += String.Format("{0}", item);
                query += ++index >= Functionparamers.Length ? String.Format(")", item) : ",";
            }

            if (connection.State != ConnectionState.Open)
            { connection.Open(); }

            cmd = new SqlCommand(query, connection);
            reader.SelectCommand = cmd;
            reader.Fill(table);
            connection.Close();
            return table;

        }

そしてそれを次のように使用します:

ExecuteSqlFunction("dbo.FGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });

この文字列を作成します:

select * from dbo.FGetNumberOfChikensInThisDate(1391/12/01,4) //日付はペルシア語

返される DataTable オブジェクトには1行ありますが、書き込むと

dataTable.Rows[0][0].ToString();

私は得る

""

文字列ですが、SQLでこのSQLコマンドを実行すると、問題なく実行されます! (実際には、SQL デザイナー内でこの関数の SQL コマンドを実行しようとすると、結果は問題なく得られますが、c# を使用して実行しようとすると、このように動作します)。

また、スカラー値関数については、最後にわずかな変更を加えて同じ前のメソッドを使用します。

 public static object ExecuteScalarSqlFunction(string functionName, string[] FunctionParameters)
        {

            string query = "select * from " + functionName + "(";
            int index = 0;
            object result;
            foreach (string item in FunctionParameters)//{0},{0}
            {
                query += String.Format("{0}", item);
                query += ++index >= FunctionParameters.Length ? String.Format(")", item) : ",";
            }

            if (connection.State != ConnectionState.Open)
            { connection.Open(); }

            cmd = new SqlCommand(query, connection);
            result = cmd.ExecuteScalar();
            connection.Close();
            return result;
        }

この関数を次のように呼び出します。

ExecuteScalarSqlFunction("dbo.FSGetNumberOfChikensInThisDate",new string[] { Date, API.CurrentSourceID });

次の SQL 文字列を作成します。

"select * from dbo.FSGetNumberOfChikensInThisDate(1391/12/01,4)"

そして、私がに着いたとき

result = cmd.ExecuteScalar(); 

セクションでは、次のような例外が生成されます。

オブジェクト名 'dbo.FSGetNumberOfChikensInThisDate' が無効です。それが存在する間!そしてそこにいます!

ExecuteSqlFunction() は残りの関数で機能していますが、これらは失敗する例外です。ExecuteScalarFunction は、何かを見落としているかどうかわからないためテストされていませんが、テーブル値の SQL 関数を処理する ExecuteSqlFunction は問題ないと確信しているため、ここで欠落しているものは他にあるはずです。

4

1 に答える 1

1

この関数は、ステートメントのソースとして使用できないFSGetNumberOfChikensInThisDateスカラー値(タイプの単一の結果)を返します。ただし、ステートメントの列ソースとして使用できます。bigintSELECTSELECT

代わりに、次のSQLステートメントを試してください。

SELECT dbo.FSGetNumberOfChikensInThisDate('1391/12/01', 4);

名前のないBigInt列の結果が1つある単一の行を返す必要があります。

于 2013-02-19T03:16:19.707 に答える