我认为这有点矫枉过正,但想问一下。正在运行以下代码,是否需要将tempList的值分配给完全独立的数组?我觉得你可以迭代tempList的值,但想在我做出改变之前验证:
List<string> tempList = new List<string>();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
try
{
if (!reader.IsDBNull(0))
{
tempList.Add(reader[0].ToString());
}
}
catch
{
}
}
reader.Close();
crMy = tempList.ToArray();
for (int q = crMy.GetLowerBound(0); q <= crMy.GetUpperBound(0); q++)
{
return crMy[q];
}
答案 0 :(得分:2)
不,您不需要数组,您的代码可以更改为:
return tempList.First();
或FirstOrDefault
取决于后面的代码。
答案 1 :(得分:2)
不需要初始化新阵列。您可以简单地遍历List<string>
。
虽然你甚至需要一个List,因为你只是返回列表中的第一个元素。这将阻止您阅读每一行,例如,如果您有100万个条目,则必须先阅读它们,然后再返回第一行。
此代码读取并直接返回第一个非空值:
string result = null;
using(var reader = cmd.ExecuteReader()){
while (reader.Read()) {
if (!reader.IsDBNull(0)) {
return resultreader[0].ToString();
}
}
答案 2 :(得分:1)
我相信您已经纠正了在这个特定情况下没有理由将List复制到数组中。
我建议在你的SqlDataReader中使用using语句,因为它是一次性对象,我在这里没有看到任何处理代码。
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
try { if (!reader.IsDBNull(0)) { tempList.Add(reader[0].ToString()); } }
catch { }
}
}
答案 3 :(得分:0)
如上所述,您的代码返回该列非空的第一行的第一列。你可以简单地写这个并完全避免列表。:
static string GetDataValue()
{
using ( SqlConnection conn = new SqlConnection("your-connect-string-here"))
using ( SqlCommand cmd = conn.CreateCommand() )
{
InitializeSqlCommand(cmd) ;
conn.Open() ;
using ( SqlDataReader reader = cmd.ExecuteReader() )
{
while ( reader.Read() && reader.IsDBNull( 0 ) )
{
string value = reader[0].ToString() ;
return value ;
}
}
}
throw new InvalidOperationException("no [useful] data returned");
}
这种方法对我来说似乎有些好奇:你可能会返回大量数据,通过网络读取所有数据,然后将所有内容丢弃,除了该列非空的第一行的第一列。
你应该修改查询以返回你想要的东西,所以改为这样的东西(相当开放):
select t.col_1, t.col_2, ... , t.col_n
from foo t
将其更改为更具体:
select top 1 t.col_1
from foo t
where t.col_1 is not null
您的RDBMS会感谢您。你的网络会感谢你。您的代码运行得更快,您的客户会更快乐,您可以用非常简单和更有意的方式替换查询逻辑:
static string GetDataValue()
{
string value ;
using ( SqlConnection conn = new SqlConnection("your-connect-string-here"))
using ( SqlCommand cmd = conn.CreateCommand() )
{
InitializeSqlCommand(cmd) ;
conn.Open() ;
value = (string) cmd.ExecuteScalar() ;
conn.Close() ;
}
if ( value == null ) throw new InvalidOperationException("no data read") ;
return value ;
}