Ich habe diese Abfrage geschrieben, um einige Ergebnisse zu erhalten, wenn ich die Ergebnisse in einem Array speichern möchte, was muss ich tun? Ich möchte die Werte in col1 und col2 in einer IF-Anweisung verwenden, deshalb denke ich, sie in einem Array zu speichern.
var con = new SqlConnection("Data Source=local;Initial Catalog=Test;Integrated Security=True");
using (con)
using (var command = new SqlCommand("SELECT col1,col2 FROM some table", con))
{
con.Open();
command.ExecuteNonQuery();
}
Normalerweise benutze ich dafür eine Klasse:
public class ClassName
{
public string Col1 { get; set; }
public int Col2 { get; set; }
}
Jetzt können Sie eine Schleife verwenden, um eine Liste zu füllen, und ToArray
, wenn Sie wirklich ein Array benötigen:
ClassName[] allRecords = null;
string sql = @"SELECT col1,col2
FROM some table";
using (var command = new SqlCommand(sql, con))
{
con.Open();
using (var reader = command.ExecuteReader())
{
var list = new List<ClassName>();
while (reader.Read())
list.Add(new ClassName { Col1 = reader.GetString(0), Col2 = reader.GetInt32(1) });
allRecords = list.ToArray();
}
}
Ich habe angenommen, dass die erste Spalte eine string
und die zweite eine integer
ist. Nur um zu zeigen, dass C # typsicher ist und wie Sie die DataReader.GetXY
-Methoden verwenden.
Anstelle von Array
können Sie Ihre Daten in DataTable
laden:
DataTable dt = new DataTable();
using (var con = new SqlConnection("Data Source=local;Initial Catalog=Test;Integrated Security=True"))
{
using (var command = new SqlCommand("SELECT col1,col2" +
{
con.Open();
using (SqlDataReader dr = command.ExecuteReader())
{
dt.Load(dr);
}
}
}
Sie können auch SqlDataAdapater
verwenden, um Ihre DataTable ähnlich zu füllen
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);
Später können Sie jede Zeile durchlaufen und wie folgt vergleichen:
foreach (DataRow dr in dt.Rows)
{
if (dr.Field<string>("col1") == "yourvalue") //your condition
{
}
}
Verwenden Sie einen SQL-Datenleser:
In diesem Beispiel verwende ich eine Liste anstelle eines Arrays.
try
{
SqlCommand comm = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories;",connection);
connection.Open();
SqlDataReader reader = comm.ExecuteReader();
List<string> str = new List<string>();
int i=0;
while (reader.Read())
{
str.Add( reader.GetValue(0).ToString() );
}
reader.Close();
}
catch (Exception)
{
throw;
}
finally
{
connection.Close();
}
Ziemlich einfach:
public void PrintSql_Array()
{
int[] numbers = new int[4];
string[] names = new string[4];
string[] secondNames = new string[4];
int[] ages = new int[4];
int cont = 0;
string cs = @"Server=ADMIN\SQLEXPRESS; Database=dbYourBase; User id=sa; password=youpass";
using (SqlConnection con = new SqlConnection(cs))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM tbl_Datos";
con.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
numbers[cont] = row.Field<int>(0);
names[cont] = row.Field<string>(1);
secondNames[cont] = row.Field<string>(2);
ages[cont] = row.Field<int>(3);
cont++;
}
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine("{0} | {1} {2} {3}", numbers[i], names[i], secondNames[i], ages[i]);
}
con.Close();
}
}
}
Eine großartige Alternative, die bisher nicht erwähnt wurde, ist die Verwendung des Entitätsframeworks, bei dem ein Objekt verwendet wird, bei dem es sich um die Tabelle handelt. Um Daten in ein Array zu bekommen, können Sie Folgendes tun:
var rows = db.someTable.SqlQuery("SELECT col1,col2 FROM someTable").ToList().ToArray();
informationen zum Einstieg in Entity Framework finden Sie unter https://msdn.Microsoft.com/en-us/library/aa937723(v=vs.113).aspx
public void ChargingArraySelect()
{
int loop = 0;
int registros = 0;
OdbcConnection conn = WebApiConfig.conn();
OdbcCommand query = conn.CreateCommand();
query.CommandText = "select dataA, DataB, dataC, DataD FROM table where dataA = 'xpto'";
try
{
conn.Open();
OdbcDataReader dr = query.ExecuteReader();
//take the number the registers, to use into next step
registros = dr.RecordsAffected;
//calls an array to be populated
Global.arrayTest = new string[registros, 4];
while (dr.Read())
{
if (loop < registros)
{
Global.arrayTest[i, 0] = Convert.ToString(dr["dataA"]);
Global.arrayTest[i, 1] = Convert.ToString(dr["dataB"]);
Global.arrayTest[i, 2] = Convert.ToString(dr["dataC"]);
Global.arrayTest[i, 3] = Convert.ToString(dr["dataD"]);
}
loop++;
}
}
}
//Declaration the Globais Array in Global Classs
private static string[] uso_internoArray1;
public static string[] arrayTest
{
get { return uso_internoArray1; }
set { uso_internoArray1 = value; }
}