我试图从一个函数中返回多个值,在该函数中我传递了一个参数并将其存储在变量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变量中。
实际出现错误“无法将空赋给隐式类型的变量”
var ZDO_S=getDo(row["TVM_LS_NO"].ToString());
标识符应为
private static (string TVD_LS_NO, string TVD_INV_NO) getDo(string DoNo)
因为'Program.getDo(String)返回void,所以return关键字必须后跟
处的对象表达式return (TVD_LS_NO, TVD_INV_NO);
答案 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,则还有其他可能性:
int value = 0;
MyFunction(ref value);
Console.WriteLine(value); //Outputs 10
void MyFunction(ref int value)
{
value = 10;
}
int value;
MyFunction(value);
Console.WriteLine(value); //Outputs 10
void MyFunction(out int value)
{
value = 10;
}
要获取两者之间的区别,additional reading. 您可以根据需要使用任意数量的ref / out参数。
使用小类/结构(首选方式)
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;
}