将数据库值返回到数组?

时间:2016-05-31 15:51:09

标签: c# sql arrays

我正在阅读我在c#visual studio(VS)程序中从arduino传入的一些值。每当我通过IR向我的arduino发送信号时,它会为我的VS文本框生成一个代码。我将它保存在名为lastvalue的变量中。

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        lastValue = serialPort1.ReadLine(); //reads serial     
    } 

该代码与数据库表列相关,我的意思是如果我发送代码1 - > a,2 - > b,......

如何在我的VS程序中按下按钮并根据我从arduino接收的代码开始循环,填充数组。想象一下,我将代码1,2,5,10发送到arduino,我想要一个像这样的数组[a,b,e,j]。

private void btnLoadDB_Click(object sender, EventArgs e)
    {
        string constring = @"Data Source=.\SQLEXPRESS...";
        SqlConnection conDataBase = new SqlConnection(constring);
        SqlCommand cmdDataBase = new SqlCommand("select LETTER from TABLE where CODE = " + lastValue + ";", conDataBase);  

        SqlDataAdapter sda = new SqlDataAdapter();
        sda.SelectCommand = cmdDataBase;
        DataTable dbdataset = new DataTable();
        sda.Fill(dbdataset);
        BindingSource bSource = new BindingSource();

        bSource.DataSource = dbdataset;
        dgvData.DataSource = bSource;
        sda.Update(dbdataset);         
    }

我现在正在做的只是按下一个按钮,它会生成一个带有一个字母的数据网格视图,对应于最后一个代码。我需要一个循环来获取数组中所有代码的所有字母。

我的SQL表:

enter image description here

所以目标:用户发送805316096,805316100和805316185,数组必须是[0,4,Key_Down]。

我现在正在做的是发送代码805316185,按下按钮并获得“Key_Down”,接下来我发送805316100,“Key_Down”替换为4。

lastValue(发送3个不同的代码):

enter image description here

提前致谢

3 个答案:

答案 0 :(得分:2)

在您的表单中,维护List<string>个代码(根据Chris Steele's answer),然后在DataReceived事件中添加到列表中:

private readonly object _sync = new object();
private readonly List<string> _receivedCodes = new List<string>();

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    var readValue = (serialPort1.ReadLine() ?? string.Empty).Trim(); //reads serial  

    if (!string.IsNullOrEmpty(readValue))
    {
        lock (_sync) _receivedCodes.Add(readValue);
        lastValue = readValue;
    } 
} 

在表单代码中添加一个方法,以便从数据库中查找代码并将其作为数组发出:

public string[] GetMappedKeyCodes()
{
    var mapping = GetMapping();

    List<string> clone;
    lock (_sync) clone = new List<string>(_receivedCodes);

    return clone.Select(code => {
                     string key;
                     return mapping.TryGetValue(code, out key)
                          ? key
                          : null;
                 })
                .Where(key => !string.IsNullOrEmpty(key))    // skip unmapped values
                .ToArray();
}

private IReadOnlyDictionary<string, string> GetMapping()
{
    var constring = @"Data Source=.\SQLEXPRESS...";

    using (var conn = new SqlConnection(constring))
    using (var cmd = new SqlCommand("select LETTER, CODE from TABLE;", conn))

    var mappedCodes = new Dictionary<string, string>();
    using (var reader = cmd.ExecuteReader())
    {
        if (reader.MoveNext())
        {
            var codeOrd = reader.GetOrdinal("CODE");
            var letterOrd = reader.GetOrdinal("LETTER");

            do
            {
                var code = reader.GetString(codeOrd);
                var letter = reader.GetString(letterOrd);
                mappedCodes[code] = letter;                
            }
            while (reader.MoveNext());
        }
    }

    return new ReadOnlyDictionary<string, string>(mappedCodes);
}

在闲暇时缓存GetMapping的结果。您可能还需要确保获取所有数据,因为可能每次都无法从串口获得完整的一行。

答案 1 :(得分:1)

将您的代码存储在列表中,并在必要时转换为数组:

List<string> codes = new List<string>();
codes.Add(code1);
codes.Add(code2);
codes.Add(code3);
string[] codeArray = codes.ToArray();

答案 2 :(得分:0)

这是我的例子:             OleDbConnection conn = new OleDbConnection();             {                 DataTable dt = new DataTable();                conn.ConnectionString =&#34;你的同情&#34;

            OleDbCommand comm = new OleDbCommand();
            {
                comm.CommandText = "Select * from *****";
                comm.Connection = conn;
                OleDbDataAdapter da = new OleDbDataAdapter();
                {
                    da.SelectCommand = comm;
                    da.Fill(dt);
                }

请注意,dt是您的DataTable