我正在阅读我在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表:
所以目标:用户发送805316096,805316100和805316185,数组必须是[0,4,Key_Down]。
我现在正在做的是发送代码805316185,按下按钮并获得“Key_Down”,接下来我发送805316100,“Key_Down”替换为4。
lastValue(发送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