System.Data.SqlClient.SqlException:“ ',' 附近有语法错误。必须声明标量变量 "@Password"。”

七层登录SQL参数问题及更新传递解决办法
博客讲述了七层登录中遇到的问题及解决办法。先是SQL语句因参数名字多标点,导致UI层输入无法传递到SQL语句。更改标点后仍有问题,发现是DAL层更新无法传递到UI层,需在BLL层更改文件输出路径,最终调试通了七层。

前言:

七层登录中遇到的问题,几乎都是通过别人的办法一下子就解决掉了!最后遇到的这个问题,卡了我3个番茄!

过程:

1 这里说明SQL语句出了问题

2 找到了问题原因,这里的参数名字多写了一个标点,导致sql查询中UI层输入框中的东西传递不到sql语句中

3  更改标点之后,重新生成,发现还是参数的名字还是多带了一个标点,明明都对了,还是跑不起来

后来发现问题是:DAL 层的更新后,在BLL层能够知道,但BLL层会隔绝更新到UI层,因为UI是不需要知道DAL层做了什么的。

所以,如果想要更新传递到UI层,需要把更新向下传递给UI层,更改文件的输出路径!

4  所以,在BLL层里,把输入路径改为UI层

各层之间的引用关系:

总结:

调试后,七层就给通了。有点蒙,还没怎么“使劲”调呢,怎么就给通了。

 

using System.Data.SqlClient; namespace DBHelper { public class DBHelper { private static string connString = "Server=YYR.;Database=VocabularyDB;Integrated Security=True;"; public static SqlConnection GetConnection() { return new SqlConnection(connString); } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DBHelper { public partial class MainForm: Form { public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { LoadWords(); } private void LoadWords() { using (SqlConnection conn = DBHelper.GetConnection()) { try { conn.Open(); string sql = "SELECT * FROM Words"; SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataTable dt = new DataTable(); da.Fill(dt); // 绑定到DataGridView dataGridView1.DataSource = dt; // 设置列标题 dataGridView1.Columns["WordID"].HeaderText = "ID"; dataGridView1.Columns["English"].HeaderText = "英文单词"; dataGridView1.Columns["Chinese"].HeaderText = "中文释义"; dataGridView1.Columns["Example"].HeaderText = "例句"; dataGridView1.Columns["CreateDate"].HeaderText = "添加日期"; } catch (Exception ex) { MessageBox.Show("加载单词失败: " + ex.Message); } } } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void btnAdd_Click(object sender, EventArgs e) { new AddEditForm().ShowDialog(); LoadWords(); } private void btnDelete_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count > 0) { int id = (int)dataGridView1.SelectedRows[0].Cells["WordID"].Value; using (SqlConnection conn = DBHelper.GetConnection()) { conn.Open(); string sql = "DELETE FROM Words WHERE WordID=@id"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@id", id); cmd.ExecuteNonQuery(); } LoadWords(); } } private void btnEdit_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count > 0) { int id = (int)dataGridView1.SelectedRows[0].Cells["WordID"].Value; new AddEditForm(id).ShowDialog(); LoadWords(); } } private void btnTest_Click(object sender, EventArgs e) { new TestForm().ShowDialog(); } private void btnExport_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "CSV文件|*.csv"; if (sfd.ShowDialog() == DialogResult.OK) { // 导出CSV代码 } } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DBHelper { public partial class AddEditForm : Form { private int? wordId = null; public AddEditForm() { InitializeComponent(); } public AddEditForm(int id) { InitializeComponent(); wordId = id; LoadWordData(); } private void LoadWordData() { using (SqlConnection conn = DBHelper.GetConnection()) { conn.Open(); string sql = "SELECT * FROM Words WHERE WordID=@id"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@id", wordId); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { txtEnglish.Text = dr["English"].ToString(); txtChinese.Text = dr["Chinese"].ToString(); txtExample.Text = dr["Example"].ToString(); } } } private void btnSave_Click(object sender, EventArgs e) { using (SqlConnection conn = DBHelper.GetConnection()) { conn.Open(); string sql = wordId.HasValue ? "UPDATE Words SET English=@eng, Chinese=@chi, Example=@exp WHERE WordID=@id" : "INSERT INTO Words (English, Chinese, Example) VALUES (@eng, @chi, @exp)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@eng", txtEnglish.Text); cmd.Parameters.AddWithValue("@chi", txtChinese.Text); cmd.Parameters.AddWithValue("@exp", txtExample.Text); if (wordId.HasValue) cmd.Parameters.AddWithValue("@id", wordId); cmd.ExecuteNonQuery(); } this.Close(); } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DBHelper { public partial class TestForm : Form { private List<Word> words = new List<Word>(); private int currentIndex = 0; private int correctCount = 0; public TestForm() { InitializeComponent(); LoadWords(); ShowNextWord(); } private void LoadWords() { using (SqlConnection conn = DBHelper.GetConnection()) { conn.Open(); string sql = "SELECT * FROM Words"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { words.Add(new Word { ID = (int)dr["WordID"], English = dr["English"].ToString(), Chinese = dr["Chinese"].ToString() }); } } // 随机排序 words = words.OrderBy(x => Guid.NewGuid()).ToList(); } private void ShowNextWord() { if (currentIndex >= words.Count) { lblWord.Text = $"测试结束!正确率: {correctCount}/{words.Count}"; txtAnswer.Enabled = false; return; } lblWord.Text = words[currentIndex].English; txtAnswer.Clear(); } private void btnCheck_Click(object sender, EventArgs e) { string userAnswer = txtAnswer.Text.Trim(); string correctAnswer = words[currentIndex].Chinese; if (userAnswer.Equals(correctAnswer, StringComparison.OrdinalIgnoreCase)) { MessageBox.Show("正确!"); correctCount++; } else { MessageBox.Show($"错误!正确答案:{correctAnswer}"); } currentIndex++; ShowNextWord(); } } class Word { public int ID { get; set; } public string English { get; set; } public string Chinese { get; set; } } } 连接到sql中,但是在界面上没有出现单词,而且添加单词也添加不了
06-05
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值