1

SQLクエリを実行しようとしているこのパブリックDataTableがありますが、うまくいきません...

public DataTable get_OrderTransaction_Master_ByOrderID(Int64 orderID)
    {
        cn = new SqlConnection(objCommon.IpcConnectionString);
        cmd = new SqlCommand("select * from dbo.OrderTransaction_Master where orderID = " + orderID, cn);
        cmd.CommandType = CommandType.Text;
        cn.Open();
        cmd.ExecuteNonQuery();
        cn.Close();
    }

get_OrderTransaction_Master_ByOrderIDと言って赤い線が出る

Error   3   'OrderTransaction_Master.get_OrderTransaction_Master_ByOrderID(long)': not all code paths return a value    C:\IPC\App_Code\OrderTransaction_Master.cs  32  22  http://localhost/ipc/

私は何を間違っていますか?

4

3 に答える 3

6

メソッドのreturnタイプはですが、メソッドDataTableにreturnステートメントがありません。また、実行cmd.ExecuteNonQuery()している必要がありますcmd.ExecuteReader()DataTable

public DataTable get_OrderTransaction_Master_ByOrderID(Int64 orderID)
{
    DataTable dt = new DataTable();
    using(var cn = new SqlConnection(objCommon.IpcConnectionString))
    {
        using(var cmd = new SqlCommand(
            "select * from dbo.OrderTransaction_Master where orderID = " + orderID, cn))
        {
            cmd.CommandType = CommandType.Text;
            cn.Open();
            using(SqlDataReader reader = cmd.ExecuteReader())
            {
                dt.Load(reader);            
                return dt;
            }
        }
    }
}

SqlConnection、、SqlCommandをステートメントSqlDataReaderに入れます。usingこれにより、usingステートメントが終了すると、オブジェクトが適切に破棄されます(接続を閉じるなど)。

于 2012-10-12T20:03:03.067 に答える
0

戻りタイプはDataTableですが、関数は何も返しません。

2つのこと、関数をvoidに変更するか、dataTableを返します

于 2012-10-12T23:33:53.690 に答える
-1

この方法は終わりがないのに役立ちます。それは私の赤ちゃんであり、本当の美しさです。

SQLQueryをパラメーターとして受け取り、DataTableオブジェクトを返します。

public DataTable DBGetDataTable(string SQLQuery)
{
    string MethodName = "public DataTable DBGetDataTable(string SQLQuery)";
    DataTable Result = null;
    SqlConnection SqlConnection = null;
    SqlCommand SqlCommand = null;
    try
    {
        string DatabaseName = "";
        string ServerNameOrIP = "";
        string DatabaseUserID = "";
        string Password = "";

        string ConnectionString = "database=" + DatabaseName + ";server=" + ServerNameOrIP + ";user ID=" + DatabaseUserID + ";PWD=" + Password + ";Connection Timeout=5000";

        SqlConnection = new SqlConnection(ConnectionString);

        SqlCommand = new SqlCommand(SQLQuery, SqlConnection);

        SqlConnection.Open();

        SqlDataReader SqlDataReader = SqlCommand.ExecuteReader();

        if (SqlDataReader.HasRows)
        {
            DataTable Dt = new DataTable();

            Dt.Load(SqlDataReader);

            Result = Dt;

        }

    }
    catch (Exception ex)
    {
        //Common.Exception(ClassName, MethodName, ex);
    }
    finally
    {
        SqlConnection.Close();
        SqlConnection.Dispose();
        SqlConnection = null;

        SqlCommand.Dispose();
        SqlCommand = null;

    }
    return Result;
}

データベースのクレデンシャルは私のものとは異なるため、上記のコード内で次の変数の値を指定する必要があります。

  • string DatabaseName = "";
  • string ServerNameOrIP = "";
  • string DatabaseUserID = "";
  • string Password = "";

それは非常に弾力性があり、それ自体が非常に効率的にクリーンアップされるため、データベースを頻繁に使用するように設計されています。

使用例を次に示します。

    StringBuilder sbSQL = new StringBuilder();

    sbSQL.AppendLine(" SET DATEFORMAT DMY");

    sbSQL.AppendLine(" SELECT");
    sbSQL.AppendLine("      TillPayment.TillPaymentId As Id");
    sbSQL.AppendLine("    , TillPayment.TransactionGuid As TransactionCode");
    sbSQL.AppendLine("    , TillPayment.Amount As Price");
    sbSQL.AppendLine("    , TillPayment.DiscountPercentage");
    sbSQL.AppendLine("    , TillPayment.Processed As ProcessedDate");
    sbSQL.AppendLine("    , PaymentType.Name As PaymentType");
    sbSQL.AppendLine("    , TillPayment.ItemType As Item");
    sbSQL.AppendLine("    , TillUser.LoginCode As Login");
    sbSQL.AppendLine("    , TillUser.Name As UserName");
    sbSQL.AppendLine("    , TillPayment.TillName As Till");

    sbSQL.AppendLine(" FROM");
    sbSQL.AppendLine("    [tblTillPayment] TillPayment");
    sbSQL.AppendLine("    INNER JOIN [tblPaymentType] PaymentType ON TillPayment.PaymentTypeId = PaymentType.PaymentTypeId");
    sbSQL.AppendLine("    INNER JOIN [tblTillUser] TillUser ON TillPayment.TillLoginCode = TillUser.LoginCode");

    int SelectedMonthFrom = GetMonthAsNumber(CboMonthReportMonth.SelectedItem.Text);

    int SelectedYearFrom = int.Parse(CboMonthReportYear.SelectedItem.Text);

    int SelectedMonthTo = SelectedMonthFrom == 12 ? 1 : SelectedMonthFrom + 1;

    int SelectedYearTo = SelectedMonthTo == 1 ? SelectedYearFrom + 1: SelectedYearFrom;

    sbSQL.AppendLine(" WHERE");
    sbSQL.AppendLine("    Processed >= '01-" + SelectedMonthFrom + "-" + SelectedYearFrom + " 00:00'");
    sbSQL.AppendLine("    AND Processed < '01-" + SelectedMonthTo + "-" + SelectedYearTo + " 00:00'");

    sbSQL.AppendLine(" AND NOT(TillUser.LoginCode = '2503' or TillUser.LoginCode = '1453')");

    sbSQL.AppendLine(" ORDER BY");
    sbSQL.AppendLine("    Till");
    sbSQL.AppendLine("    , Processed");

    DataTable DtReport = DBGetDataTable(sbSQL.ToString());

もちろん、SQLクエリは私のものとは異なります。

私はStringBuilderオブジェクトを使用しましたが、文字列に直接書き込む方が快適な場合は、代わりにそれを行うことができます。

あなたが書いた

それでも同じエラーエラー3が発生します'OrderTransaction_Master.get_OrderTransaction_Master_ByOrderID(long)':すべてのコードパスが値を返すわけではありませんC:\ IPC \ App_Code \ OrderTransaction_Master.cs 33 22 http:// localhost / ipc /

これは、OrderTransaction get_OrderTransaction_Master_ByOrderID(long OrderId)というメソッドのデフォルトの戻り値がないことを示しています。

問題のメソッドは次のようになると思います。

    public OrderTransaction get_OrderTransaction_Master_ByOrderID(long OrderId)
    {
        string MethodName = "public OrderTransaction get_OrderTransaction_Master_ByOrderID(long OrderId)";
        OrderTransaction Result = null;
        try{
            StringBuilder sbSQL = new StringBuilder();

            sbSQL.AppendLine(" SELECT");
            sbSQL.AppendLine("    *");

            sbSQL.AppendLine(" FROM");
            sbSQL.AppendLine("    dbo.OrderTransaction_Master");

            sbSQL.AppendLine(" WHERE");
            sbSQL.AppendLine("    OrderID = " + OrderID);

            DataTable Dt = DBGetDataTable(sbSQL.ToString())

            OrderTransaction OrderTransaction = new OrderTransaction(Dt);

            Result = OrderTransaction;

        }
        catch(Exception ex)
        {
            //Common.Exception(ClassName,MethodName,ex);
        }
        return Result;
    }

ご不明な点がございましたらお問い合わせください。

于 2014-05-20T15:07:32.900 に答える