1

現在、SQLCommand を使用してストアド プロシージャを実行し、結果を返すクラスのメンバーを使用して、データグリッドにデータを入力しようとしています。

私のクラス メンバー (および問題があると思われる場所) は次のとおりです。

public DataView DisplayHealthIndicator(DateTime startDate, DateTime endDate)
{
    string queryString =
        "DECLARE @RC int"
        + "DECLARE @date_from datetime = dateadd(day, 0, datediff(day, 0, getdate()))"
        + "DECLARE @date_to datetime = dateadd(day, 0, datediff(day, 0, getdate()))"

        + "EXECUTE @RC = [Testing].[marlin].[support_retrieve_workflow_history] "
            + "@date_from "
            + ",@date_to"
        + "GO";

    using (SqlConnection connection = new SqlConnection(GetConnectionString()))
    {
        using (var cmd = new SqlCommand(queryString, connection))
        {
            connection.Open();

            var reader = cmd.ExecuteReader();

            var dt = new DataTable();
            dt.Load(reader);

            return dt.DefaultView;
        }
    }

}

そして、私は次を使用してこのメ​​ンバーを呼び出しています:

var db = new DatabaseHandle();
        dataGridWorkflow.ItemsSource = db.DisplayHealthIndicator(DateTime.Now, DateTime.Now);

でも!現在、次のエラーが表示されます。

Incorrect syntax near @date_from

Must declare the scalar variable @RC

ある程度エラーを理解しています.sqlQuery文字列で変数を宣言できないと思います...しかし、どうすればこれを行うことができますか?

これに関係がないことはかなり確信していますが、関係がある場合、これはストアドプロシージャの内容です:

create procedure marlin.support_retrieve_workflow_history
(
    @date_from datetime,
    @date_to datetime
)
as
select  dateadd(day, 0, datediff(day, 0, e.event_date)) as 'Date',
        c.setting_secondary 'Workflow Category' ,
        d.setting_main as 'Error Type' ,
        sum(e.event_count) as 'Total'
from    marlin.support_events e
        inner join marlin.support_config c
            on e.event_category = c.setting_code
            and c.config_code = 60
        inner join marlin.support_config d
            on e.event_type = d.setting_code
            and d.config_code = 70
where   e.event_date between @date_from and @date_to
group by 
        e.event_date,
        c.setting_secondary ,
        d.setting_main
4

2 に答える 2

1

cmd.Parameters["@ReturnValue"]戻り値が含まれています - 動的 SQL でパラメータを追加する必要はありません

パラメータをコマンドに追加します

cmd.Parameters.AddWithValue("ParamName", Value);

また、cmd.CommandType (呼び出されない可能性があります。cmd のメンバーを確認してください) を StoredProcedure に変更します。

例えば

using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
    using (var cmd = new SqlCommand(queryString, connection))
    {
        connection.Open();

        cmd.CommandType = ??.StoredProcedure; // Can't remember what enum name is prob SqlCommandType or something
        cmd.Parameters.AddWithValue("date_from", DateTime.blah.blah);
        cmd.Parameters.AddWithValue("date_to", DateTime.blah.blah);
        var reader = cmd.ExecuteReader();

        var dt = new DataTable();
        dt.Load(reader);

        return dt.DefaultView;
    }
}

免責事項: これらの prop 名の一部、戻り値パラメーターの名前が正しくない可能性があるため、ドキュメントを確認してください :)

于 2012-08-11T12:12:18.017 に答える
0

この投稿は少し古いですが、WPF DataGrid に動的にデータを入力する方法を共有したかったのです。

private void Fill_DataGrid_ServiceName()
    {
        this.Cursor = Cursors.Wait;

        // create an instance
        DatabaseClass objDatabaseClass = new DatabaseClass(_connectionString);

        // if we are able to open and close the SQL Connection then proceed
        if (objDatabaseClass.CheckSQLConnection())
        {
            try
            {
                // create an instance. variable 'con' will hold the instance
                SqlConnection con = new SqlConnection(_connectionString);

                con.Open();

                // Query to populate the Grid
                string Query = @"SELECT 
                                cm_mktdata_mdsservice_fits_to_finance_id_unique AS [Id Unique]
                                ,cm_mktdata_mdsservice_fits_to_finance_MDSService_fits AS [FITS MDSService]
                                ,cm_mktdata_mdsservice_fits_to_finance_MDSService_finance AS [Finance MDSService]
                                ,'[ ' + CONVERT(varchar, user_detail_user_info_id_user) + ' ] ' + user_detail_user_info_nm_login AS [Last Modified By]
                                ,cm_mktdata_mdsservice_fits_to_finance_record_version AS [Record Version]
                                ,cm_mktdata_mdsservice_fits_to_finance_dt_modified AS [Dt Modified]
                                ,cm_mktdata_mdsservice_fits_to_finance_ind_active AS [Ind Active]
                            FROM 
                                dbo.v_mktdata_ui_mdsservice_fits_to_finance_detail
                            WHERE
                                cm_mktdata_mdsservice_fits_to_finance_ind_operational = 1
                            ORDER BY
                                cm_mktdata_mdsservice_fits_to_finance_MDSService_fits";


                SqlCommand createCommand = new SqlCommand(Query, con);
                createCommand.ExecuteNonQuery();

                // transfer the results of createCommand to the dataGrid
                SqlDataAdapter dataAdapter = new SqlDataAdapter(createCommand);
                DataTable dt = new DataTable("vcm_mktdata_mdsservice_fits_to_finance");
                dataAdapter.Fill(dt);
                dataGrid_ServiceName.ItemsSource = dt.DefaultView;
                dataAdapter.Update(dt);

                con.Close();

                // Enable the Refresh Grid Button
                btn_RefreshGrid_ServiceName.IsEnabled = true;


                // get DataGrid row count                    
                lbl_dataGrid_RowCount_ServiceName.Content = dataGrid_ServiceName.Items.Count.ToString() + " rows";

                //return true;
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.ToString());
                //return false;
            }
        }
        else
        {
            MessageBox.Show("Connection not established to the SQL Server. " + Environment.NewLine + "The SQL Server may be offline or valid credentials are not yet granted.", "SQL Server Connection Error", MessageBoxButton.OK, MessageBoxImage.Error);

            this.Close();
        }

        this.Cursor = Cursors.Arrow;
    }

DatabaseClass は次のとおりです。

   class DatabaseClass
{
    // Variables
    private string _connectionString = "";


    public DatabaseClass(string connectionString)
    {
        _connectionString = connectionString;  
    }

    /// Check to see if Connection can be opened
    /// 
    /// Returns True if the connection can be open else it returns False
    ///
    public bool CheckSQLConnection()
    {
        SqlConnection con = new SqlConnection(_connectionString);

        try 
        {           
            con.Open();
            con.Close();

            return true;
        }
        catch (SqlException ex)
        {       
           return false;
        }
    }

}

接続文字列の場合、次のようになります

public static string SQLDataSourceStr = "Data Source=MySQL-DB-DV;Initial Catalog=My_Data;Integrated Security=True";
于 2015-03-06T21:08:58.087 に答える