在C#中结合SQL数据库和条码扫描(BarCode Scan)功能,可以构建一个完整的条码数据采集与管理系统。以下是分步骤的实现方案,涵盖硬件对接、数据库设计和代码实现:
一、系统架构设计
硬件层
条码扫描枪(支持键盘模拟或串口/USB通信)
工业PC或普通计算机(运行C#程序)
数据层
SQL Server/MySQL/SQLite 数据库(存储条码数据及相关业务信息)
应用层
C# WinForms/WPF 应用程序(处理条码输入、数据库交互和业务逻辑)
二、数据库设计(SQL示例)
以SQL Server为例,创建存储条码数据的表:
sqlCREATE TABLE BarcodeData (Id INT PRIMARY KEY IDENTITY(1,1),Barcodevalue NVARCHAR(50) NOT NULL,ProductName NVARCHAR(100),ScanTime DATETIME DEFAULT GETDATE(),Operator NVARCHAR(50),Status TINYINT DEFAULT 0 -- 0:未处理, 1:已处理);
三、C#实现步骤
1. 条码扫描输入处理
键盘模拟扫描枪:直接监听文本框输入(回车键触发提交)。
串口扫描枪:通过
System.IO.Ports
读取数据。
示例代码(键盘模拟):
csharp
using System; using System.Data.SqlClient; using System.Windows.Forms;
public partial class MainForm : Form { private readonly string _connectionString = "Server=.;Database=BarcodeDB;Integrated Security=True;";
public MainForm() { InitializeComponent(); txtBarcode.KeyDown += TxtBarcode_KeyDown; // 绑定回车事件 }
private void TxtBarcode_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { string barcode = txtBarcode.Text.Trim(); if (!string.IsNullOrEmpty(barcode)) { SaveBarcodeToDatabase(barcode); txtBarcode.Clear(); } } }
private void SaveBarcodeToDatabase(string barcode) { using (var connection = new SqlConnection(_connectionString)) { string query = "INSERT INTO BarcodeData (Barcodevalue, Operator) VALUES (@Barcode, @Operator)"; var command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@Barcode", barcode); command.Parameters.AddWithValue("@Operator", Environment.UserName);
connection.Open(); command.ExecuteNonQuery(); } MessageBox.Show($"条码 {barcode} 已保存!"); } }
2. 串口扫描枪实现
csharp
using System.IO.Ports;
public partial class MainForm : Form { private SerialPort _serialPort;
public MainForm() { InitializeComponent(); _serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); _serialPort.DataReceived += SerialPort_DataReceived; _serialPort.Open(); }
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { string barcode = _serialPort.ReadLine().Trim(); this.Invoke((MethodInvoker)delegate { SaveBarcodeToDatabase(barcode); }); } }
3. 数据库查询与展示
csharp
private void btnQuery_Click(object sender, EventArgs e) { using (var connection = new SqlConnection(_connectionString)) { string query = "SELECT * FROM BarcodeData WHERE ScanTime BETWEEN @Start AND @End"; var command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@Start", dtpStart.Value); command.Parameters.AddWithValue("@End", dtpEnd.Value);
var adapter = new SqlDataAdapter(command); var dataTable = new DataTable(); adapter.Fill(dataTable); dataGridView.DataSource = dataTable; } }
四、关键功能扩展
条码校验
csharpprivate bool IsValidBarcode(string barcode){// 示例:校验EAN-13格式return barcode.Length == 13 && long.TryParse(barcode, out _);}
重复扫描拦截
csharpprivate bool IsDuplicate(string barcode){using (var connection = new SqlConnection(_connectionString)){string query = "SELECT COUNT(1) FROM BarcodeData WHERE Barcodevalue = @Barcode";var command = new SqlCommand(query, connection);command.Parameters.AddWithValue("@Barcode", barcode);connection.Open();return (int)command.ExecuteScalar() > 0;}}
导出到Excel
使用EPPlus
库:csharp
using OfficeOpenXml; private void ExportToExcel(DataTable data) { using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("条码数据"); worksheet.Cells["A1"].LoadFromDataTable(data, true); package.SaveAs(new FileInfo(@"C:\BarcodeData.xlsx")); } }
五、部署与优化
硬件兼容性
测试不同品牌扫描枪(如Honeywell、Zebra)的通信协议。
处理扫码枪的前缀/后缀字符(如
\r\n
)。性能优化
对高频扫描场景使用批量插入(
SqlBulkCopy
)。添加数据库索引加速查询:
sqlCREATE INDEX IX_Barcode_Time ON BarcodeData(ScanTime);
异常处理
csharptry{connection.Open();command.ExecuteNonQuery();}catch (SqlException ex){LogError(ex.Message);MessageBox.Show("数据库写入失败!");}
六、完整项目结构
BarcodeScannerApp/├── MainForm.cs # 主界面├── DatabaseHelper.cs # 数据库操作封装├── Barcodevalidator.cs # 条码校验逻辑└── App.config # 数据库连接字符串
通过以上方案,可实现一个稳定的条码扫描系统,适用于生产物流、仓储管理等场景。根据实际需求,可进一步集成条码打印、Web API或云同步功能。