C#读多串口,我已经可以读6个串口,但是写入数据库时遇到了问题。 不会向数据库写数据,就找一本入门书,花半个月把里边的 ADO.NET 部分好好练习一下。如果以前没有学过关系数据库,那么花一年时间去上学。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.工控程序需要对多线程进行处理2.像JZ_RecePort1_DataReceived_JZ这些函数实际上是在后台线程中执行的3.在后台线程中不要进行访问数据库这样的耗时操作,收到数据后,先写入缓存(就是变量)里面4.前台线程中,启动一个Timer,,每隔一段时间去读一次缓存注意:写和读缓存的时候,要用Monitor.Enter和Monitor.Exit同步 给你个例子吧,根据自己需要改一下 public class COM { private SerialPort sp; private string val = ""; public COM(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity) { sp = new SerialPort(); sp.PortName = portName; sp.BaudRate = baudRate; sp.DataBits = dataBits; sp.StopBits = stopBits; sp.Parity = parity; sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); } public void open() { try { sp.Open(); } catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); } } public void close() { if (sp != null && sp.IsOpen) sp.Close(); } public string getValue() { string v; Monitor.Enter(this); v = string.Copy(val); Monitor.Exit(this); return v; } public void setValue(string v) { Monitor.Enter(this); val = string.Copy(v); Monitor.Exit(this); } public void send(string v) { try { sp.Write(v); } catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); } } private void sp_DataReceived(System.Object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { Thread.Sleep(100); //延时等待数据接收完毕 try { string str = sp.ReadExisting(); setValue(str); } catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); } } } public void Data_Write(string[] data_rece) { for (int i = 0; i < 4; i++) { char[] reve = new char[80]; reve = data_rece[i].ToCharArray(); //判断接收到的数据来自哪一块CPU if (reve[5].ToString() == "0") { //判断对应的CPU表是否为空 int n = getTableId(Table_Name[i, 0]); if (n == 0) { reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据 //更新对应的CPU表,将数据擦人表中 sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; get_DB_Com(sql); sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc"; reference = name(sql); //记录其实计数时间 } //当CPU表不为空时 else { //比较新接收到的数据是否和前一次接收到的数据相同 if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) & (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) & (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) & (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) & (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52])) { //相同,更新结束时间 sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'"; get_DB_Com(sql); } else { // 不相同时,更新数据编。 sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; this.get_DB_Com(sql); reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据 } } } else { //判断表是否为空 int n = getTableId(Table_Name[i, 1]); if (n == 0) { reference = DateTime.Now.ToString(); //记录其实计数时间 reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据 // 更新数据库表 sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + Com_Reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; get_DB_Com(sql); sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc"; reference = name(sql); //记录其实计数时间 } else { if (Com_Reve == null) { sql = "select top 1 sendPoint from " + Table_Name[i, 1] + " order by ID desc"; Com_Reve[1]=name(sql); } if (reve[1] == Com_Reve[1] & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) & (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) & (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) & (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) & (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52])) { reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据 sql = "UPDATE " + Table_Name[i, 1] + " set stopTime= '" + DateTime.Now.ToString() + "'"; get_DB_Com(sql); } else { sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc"; reference = name(sql); //记录其实计数时间 sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; get_DB_Com(sql); } } } } } reve.CopyTo(Com_Reve, 0); 这什么乱糟糟的逻辑,for循环里的i,后面处理根本没用上???你应该将串口数据放进二维数组中或者如果串口数据有规律,都放进一维数组也行比如固定是12个字节的话,串口1放到0-11,串口2放到12-23...然后循环去处理6个串口的数据入库循环里都没有使用循环变量,那你6次循环岂不是一模一样的操作 先把逻辑捋清楚了,再写代码.从你乱糟糟的代码里,根本看不明白到底想干嘛6组数据分别放到不同的地方,这个地方就要首先保证不能有交叉覆盖前面Com_Receive[1] = utility.ByteArrayToBinaryString(bits);这是闹哪样,看后面Com_Receive明显是个一维数组,每组数据就只有1个字节???你这不是从1开始,把串口1的数据都覆盖了然后6组数据应该分别处理,串口1变化,就更新串口1,串口2变化,就更新串口2而不是逻辑都混到一起.你后面那么多&&是闹哪样,非要六个串口同时变化才更新,有1个不变就不更新??? 抱歉。代码有点乱!是这样的:我就6个串口接收上来的数据放在了Com_Receive[]数组里,接收上来的数据位十个字节,然后再Data_Write()函数中循环写入数据库。在主函数中,用timer控制写入时间,每秒钟中写入一次! for (int i = 1; i < 4; i++) { char[] reve = new char[80]; reve = data_rece[i].ToCharArray(); //判断接收到的数据来自哪一块CPU if (reve[5].ToString() == "0") { //判断对应的CPU表是否为空 int n = getTableId(Table_Name[i, 0]); if (n == 0) { reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据 //更新对应的CPU表,将数据擦人表中 sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; get_DB_Com(sql); } //当CPU表不为空时 else { //比较新接收到的数据是否和前一次接收到的数据相同 if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) & (reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) & (reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) & (reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) & (reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52])) { //相同,更新结束时间 sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'"; get_DB_Com(sql); } else { // 不相同时,更新数据编。 sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " + "VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," + "'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) "; this.get_DB_Com(sql); reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据 } } } 我上面贴的程序就是讲收到的数据存在一个数据库数组中,每一秒钟写一次数据库我给的是一个后台运行的类,前台只需要创建对象,并调用里面的公共方法就行了,访问数据库是在前台的定时器timer事件中完成的,总的思想是把串口操作单独分离开当然,取回来的数据(这里是字符串)要自己解析处理工控里面的数据库访问其实非常简单,如果你觉得难,可以找一个SQLHelper类来完成 有个想法,不知道,有没有可行性,高手来帮我看下 无边框窗体如何调整大小? 用C#在窗体上画统计图 c# 中如何获取系统中“所有“的字体? ListBox滚动条的控制? 如何刷新屏幕?? 正在下的Visual Studio 2005,大家一起来顶!!!! 关于子窗口的显示问题 为什么C#时没有析构函数,也没有delete? 如何在C#后台代码中用javascript的window.confirm('你要删除这个部门,真的要如此吗');功能。 无名的json怎么解析? 针对任何数值类型的排序算法
2.像JZ_RecePort1_DataReceived_JZ这些函数实际上是在后台线程中执行的
3.在后台线程中不要进行访问数据库这样的耗时操作,收到数据后,先写入缓存(就是变量)里面
4.前台线程中,启动一个Timer,,每隔一段时间去读一次缓存
注意:写和读缓存的时候,要用Monitor.Enter和Monitor.Exit同步
public class COM
{
private SerialPort sp;
private string val = ""; public COM(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity)
{
sp = new SerialPort();
sp.PortName = portName;
sp.BaudRate = baudRate;
sp.DataBits = dataBits;
sp.StopBits = stopBits;
sp.Parity = parity;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
} public void open()
{
try
{
sp.Open();
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
} public void close()
{
if (sp != null && sp.IsOpen) sp.Close();
} public string getValue()
{
string v;
Monitor.Enter(this);
v = string.Copy(val);
Monitor.Exit(this);
return v;
}
public void setValue(string v)
{
Monitor.Enter(this);
val = string.Copy(v);
Monitor.Exit(this);
} public void send(string v)
{
try
{
sp.Write(v);
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
} private void sp_DataReceived(System.Object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread.Sleep(100); //延时等待数据接收完毕
try
{
string str = sp.ReadExisting();
setValue(str);
}
catch (Exception ex) { Trace.WriteLine(sp.PortName+ ex.Message); }
}
}
{
for (int i = 0; i < 4; i++)
{
char[] reve = new char[80];
reve = data_rece[i].ToCharArray();
//判断接收到的数据来自哪一块CPU
if (reve[5].ToString() == "0")
{
//判断对应的CPU表是否为空
int n = getTableId(Table_Name[i, 0]);
if (n == 0)
{
reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据
//更新对应的CPU表,将数据擦人表中
sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
get_DB_Com(sql);
sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
reference = name(sql); //记录其实计数时间 }
//当CPU表不为空时
else
{ //比较新接收到的数据是否和前一次接收到的数据相同
if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
(reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
(reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
(reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
(reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
{
//相同,更新结束时间
sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'";
get_DB_Com(sql);
}
else
{
// 不相同时,更新数据编。
sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
this.get_DB_Com(sql);
reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据
}
}
}
else
{
//判断表是否为空
int n = getTableId(Table_Name[i, 1]);
if (n == 0)
{
reference = DateTime.Now.ToString(); //记录其实计数时间
reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据
// 更新数据库表
sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + Com_Reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
get_DB_Com(sql);
sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
reference = name(sql); //记录其实计数时间
}
else
{
if (Com_Reve == null)
{
sql = "select top 1 sendPoint from " + Table_Name[i, 1] + " order by ID desc";
Com_Reve[1]=name(sql);
}
if (reve[1] == Com_Reve[1] & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
(reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
(reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
(reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
(reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
{
reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据
sql = "UPDATE " + Table_Name[i, 1] + " set stopTime= '" + DateTime.Now.ToString() + "'";
get_DB_Com(sql);
}
else
{
sql = "select top 1 starttime from " + Table_Name[i, 0] + " order by ID desc";
reference = name(sql); //记录其实计数时间
sql = "INSERT INTO " + Table_Name[i, 1] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
get_DB_Com(sql);
}
}
}
}
}
这什么乱糟糟的逻辑,for循环里的i,后面处理根本没用上???你应该将串口数据放进二维数组中
或者如果串口数据有规律,都放进一维数组也行
比如固定是12个字节的话,串口1放到0-11,串口2放到12-23...然后循环去处理6个串口的数据入库
循环里都没有使用循环变量,那你6次循环岂不是一模一样的操作
从你乱糟糟的代码里,根本看不明白到底想干嘛6组数据分别放到不同的地方,这个地方就要首先保证不能有交叉覆盖
前面Com_Receive[1] = utility.ByteArrayToBinaryString(bits);这是闹哪样,看后面Com_Receive明显是个一维数组,每组数据就只有1个字节???你这不是从1开始,把串口1的数据都覆盖了然后6组数据应该分别处理,串口1变化,就更新串口1,串口2变化,就更新串口2
而不是逻辑都混到一起.你后面那么多&&是闹哪样,非要六个串口同时变化才更新,有1个不变就不更新???
是这样的:
我就6个串口接收上来的数据放在了Com_Receive[]数组里,接收上来的数据位十个字节,然后再Data_Write()函数中循环写入数据库。
在主函数中,用timer控制写入时间,每秒钟中写入一次!
{
char[] reve = new char[80];
reve = data_rece[i].ToCharArray();
//判断接收到的数据来自哪一块CPU
if (reve[5].ToString() == "0")
{
//判断对应的CPU表是否为空
int n = getTableId(Table_Name[i, 0]);
if (n == 0)
{ reve.CopyTo(Com_Reve, 0); //保存每次第一次接收到的数据,最为中间比较数据
//更新对应的CPU表,将数据擦人表中
sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + DateTime.Now.ToString() + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
get_DB_Com(sql);
}
//当CPU表不为空时
else
{
//比较新接收到的数据是否和前一次接收到的数据相同
if ((reve[1] == Com_Reve[1]) & (reve[2] == Com_Reve[2]) & (reve[47] == Com_Reve[47]) &
(reve[46] == Com_Reve[46]) & (reve[45] == Com_Reve[45]) &
(reve[44] == Com_Reve[44]) & (reve[43] == Com_Reve[43]) &
(reve[55] == Com_Reve[55]) & (reve[54] == Com_Reve[54]) &
(reve[53] == Com_Reve[53]) & (reve[52] == Com_Reve[52]))
{
//相同,更新结束时间
sql = "UPDATE " + Table_Name[i, 0] + " set stopTime='" + DateTime.Now.ToString() + "'";
get_DB_Com(sql);
}
else
{
// 不相同时,更新数据编。
sql = "INSERT INTO " + Table_Name[i, 0] + "( startTime,stopTime, sendPoint ,receivePoint ,GD_readBack,ZX_Output_readBack ,FX_0utput_readBack ,GJ_JDQ_readBack ,system_falue ,CT1_1_SZ ,CT1_2_SZ ,CT2_1_SZ ,CT2_2_SZ ) " +
"VALUES ( '" + reference + "', '" + DateTime.Now.ToString() + "' ,'" + reve[1] + "','" + reve[2] + "','" + reve[47] + "'," +
"'" + reve[46] + "','" + reve[45] + "','" + reve[44] + "','" + reve[43] + "','" + reve[55] + "','" + reve[54] + "','" + reve[53] + "','" + reve[52] + "' ) ";
this.get_DB_Com(sql);
reve.CopyTo(Com_Reve, 0); //将新接收到的数据作为中间数据
}
}
}
当然,取回来的数据(这里是字符串)要自己解析处理
工控里面的数据库访问其实非常简单,如果你觉得难,可以找一个SQLHelper类来完成