尝试通过在C#中的函数中传递单个值来返回多个值

时间:2019-06-21 10:36:07

标签: c#

我试图从一个函数中返回多个值,在该函数中我传递了一个参数并将其存储在变量ZDO_S

在变量ZDO_S中,我试图存储两个值,这些值将通过传递单个值'row [“ TVM_LS_NO”]。ToString()'而获得,该值是从'getdo'函数的数据库中获取的

var ZDO_S = getDo(row["TVM_LS_NO"].ToString());

这是方法:

private static (string TVD_LS_NO, string TVD_INV_NO) getDo(string DoNo)
{           
    try
    {
        using (OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["Oracle_To_Sql.Properties.Settings.Setting"].ToString()))
        {
            string query = "select SUBSTR(TVD_DO_ITEM_NO,'1','10') from T_VEHICLE_DTL1  where TVD_LS_NO=:TVD_LS_NO";
            OracleCommand myCommand = new OracleCommand(query, con);
            DataTable dt = new DataTable();
            OracleDataAdapter da = new OracleDataAdapter(myCommand);
            da.SelectCommand = new OracleCommand(query, con);                    
            da.Fill(dt);                    

            foreach (DataRow row in dt.Rows)
            {
                string TVD_LS_NO = row["TVD_LS_NO"].ToString();
                string TVD_INV_NO = row["TVD_INV_NO"].ToString();                        
            }

            return (TVD_LS_NO, TVD_INV_NO);
        }
    }
    catch (Exception ex)
    {
        throw;
    }

}

应该返回预期值并将其存储在ZDO_S变量中。

  1. 实际出现错误“无法将空赋给隐式类型的变量”

    var ZDO_S=getDo(row["TVM_LS_NO"].ToString());
    
  2. 标识符应为

    private static (string TVD_LS_NO, string TVD_INV_NO) getDo(string DoNo)
    
  3. 因为'Program.getDo(String)返回void,所以return关键字必须后跟

    处的对象表达式
    return (TVD_LS_NO, TVD_INV_NO);
    

2 个答案:

答案 0 :(得分:1)

我对C#不太熟悉,但是如果您想在单个return语句中返回多个值,那么唯一的方法通常是数组或对象。在您的情况下,数组将是最简单的。

  • 返回类型定义看起来不像数组返回类型,请尝试

private static string[] getDo() {...

  • return语句本身看起来不像数组,请尝试将值作为数组返回

  • 您正在foreach循环内定义变量,这通常使它们在循环外不可访问。尝试定义循环外的变量,并在循环中使用

我不知道这是否是有效的C#,但是像这样:

private static String[] getDo(string DoNo)
    {           
        try
        {
            using (OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["Oracle_To_Sql.Properties.Settings.Setting"].ToString()))
            {
                String[] toReturn = new String[2];
                string TVD_LS_NO, TVD_INV_NO;
                string query = "select SUBSTR(TVD_DO_ITEM_NO,'1','10') from T_VEHICLE_DTL1  where TVD_LS_NO=:TVD_LS_NO";
                OracleCommand myCommand = new OracleCommand(query, con);
                DataTable dt = new DataTable();
                OracleDataAdapter da = new OracleDataAdapter(myCommand);
                da.SelectCommand = new OracleCommand(query, con);                    
                da.Fill(dt);                    
                foreach (DataRow row in dt.Rows)
                {
                    TVD_LS_NO = row["TVD_LS_NO"].ToString();
                    TVD_INV_NO = row["TVD_INV_NO"].ToString();                        
                }
                toReturn[0] = TVD_LS_NO;
                toReturn[1] = TVD_INV_NO;
                return toReturn;
            }
        }
        catch (Exception ex)
        {

            throw;
        }

    }

不确定这是否是最佳答案,但我希望它会向正确的方向发展。

答案 1 :(得分:0)

这里有一些问题,让我们尝试一一解决。

  • 首先,您说要返回两个值,但是要在for循环中分配它们,这可能意味着它们将被分配多次。这是故意的吗?还是您希望for循环仅运行一次?

  • 然后,您在for循环中声明变量,这意味着它们在退出循环时将被破坏,失去其值并使编译器生气(和悲伤)。

  • 您正在尝试使用自C#7起编译器已知的返回结果语法。如果您使用的是先前版本,则根本无法使用。

  • 最后,如果您没有在catch块中执行任何操作,则try / catch完全没有用,因此可以将其删除。

如果我可以建议some additional understanding on TUples

因此,如果我们在C#7中将其抓取,则看起来像这样:

private static (string TVD_LS_NO, string TVD_INV_NO) getDo(string DoNo)
{
    //We declare our return value(s)
    var toReturn(TVD_LS_NO: "", TVD_INV_NO: "");

    using (OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["Oracle_To_Sql.Properties.Settings.Setting"].ToString()))
    {
        string query = "select SUBSTR(TVD_DO_ITEM_NO,'1','10') from T_VEHICLE_DTL1  where TVD_LS_NO=:TVD_LS_NO";
        OracleCommand myCommand = new OracleCommand(query, con);
        DataTable dt = new DataTable();
        OracleDataAdapter da = new OracleDataAdapter(myCommand);
        da.SelectCommand = new OracleCommand(query, con);                    
        da.Fill(dt);                    

        foreach (DataRow row in dt.Rows)
        {
            //We assign our return values
            toReturn.TVD_LS_NO = row["TVD_LS_NO"].ToString();
            toReturn.TVD_INV_NO = row["TVD_INV_NO"].ToString();                        
        }

        return toReturn;
}

但这仅适用于C#7

如果您不使用C#7,则还有其他可能性:

  1. Use ref keyword

    int value = 0;
    MyFunction(ref value);
    Console.WriteLine(value); //Outputs 10
    
    void MyFunction(ref int value)
    {
        value = 10;
    }
    
  2. Use out keyword

    int value;
    MyFunction(value);
    Console.WriteLine(value); //Outputs 10
    
    void MyFunction(out int value)
    {
        value = 10;
    }
    

    要获取两者之间的区别,additional reading. 您可以根据需要使用任意数量的ref / out参数。

  3. 使用小类/结构(首选方式)

    public struct MyResultValues //could be public class MyResultValues
    {
        public int result1;
        public string result2;
    }
    
    MyResultValues result = MyFunction();
    Console.WriteLine(result.result1);
    Console.WriteLine(result.result2);
    
    public MyResultValues MyFunction()
    {
        MyResultValues toReturn = new MyResultValues();
        toReturn.result1 = 10;
        toReturn.result2 = "Hello World !";
        return toReturn;
    }