Как написано, ваш код возвращает первый столбец первой строки, где этот столбец не равен нулю. Вы могли бы просто написать это и избежать список в целом .:
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
Ваш РСУБД благодарит вас. Ваша сеть будет вам благодарна. Ваш код будет работать быстрее, ваши клиенты будут счастливее, и вы можете заменить логику запроса чрезвычайно простым и более умышленным:
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 ;
}
Что вы пытаетесь достичь здесь? вы фактически не итерируете. Вы просто возвращаете первое значение tempList. –
Возможно ли переполнение 1-го списка второму массиву crMy? –
MasterOfStupidQuestions