报错:
The variable name '@Name' has already been declared. Variable names must be unique within a query batch or stored procedure.document All:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;namespace ImportExportFiles
{
    public partial class Form1 : Form
    {
        public Form1 ()
        {
            InitializeComponent();
        }        private void btnImport_Click (object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
            {
                conn.Open();
                if (ofImport.ShowDialog() != DialogResult.OK) //如果用户选择取消,则退出.
                {
                    return;
                }
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //从指定路径读取文件.
                    using (FileStream fileStream = File.OpenRead(ofImport.FileName))
                    {
                        using (StreamReader streamReader = new StreamReader(fileStream))
                        {
                            string line = null; //存储从文件中读取的每行的信息.
                            while (null != (line = streamReader.ReadLine())) //不断读取,知道行中没有数据.
                            {
                                string[] people = line.Split('|'); //获取每个成员信息.
                                string name = people[0].Trim(); //提取每个成员的姓名部分,如果有空格,去除.
                                int age = Convert.ToInt32(people[1].Trim()); //提取每个成员的年龄部分,如果有空格,去除.
                                //用提取参数的方法将每个成员的信息写入表中.
                                cmd.CommandText = "insert into Peoples(Name,Age) values(@Name,@Age)";
                                cmd.Parameters.Add(new SqlParameter("Name", name));
                                cmd.Parameters.Add(new SqlParameter("Age", age));
                                cmd.ExecuteNonQuery(); //这里报错!
                            }
                        }
                    }
                        
                }
                MessageBox.Show("Import Succeed!");
            }
        }
    }
}我的需求是:
在 winfrom 中,单击 “导入”按钮,就弹出一个对话框(让用户选择要读取的文件),提取文件每行的“ Name” 和“Age”部分,然后通过连接 SQLServer,添加到我的表“People"表!
这个问题我碰到两次了。
明明的的程序中就只有一个 Name 属性(那个 @Name占位符又不算),总是说的已经声明多 Name)。
到底是什么歌原因哈!谢谢大家的时间!

解决方案 »

  1.   

    cmd.Parameters.Add(new SqlParameter("Name", name));
                                    cmd.Parameters.Add(new SqlParameter("Age", age));
    因为这两句写在循环内,所以会重复添加参数
      

  2.   

    因为如果我这样改也报这样的错:
    The variable name '@N' has already been declared. Variable names must be unique within a query batch or stored procedure.cmd.CommandText = "insert into Peoples(Name,Age) values(@N,@A)";
                                    cmd.Parameters.Add(new SqlParameter("N", name));
                                    cmd.Parameters.Add(new SqlParameter("A", age));
    所以我就觉得好像 visual studio 给我报的错不是正确的!
      

  3.   

    把using (SqlCommand cmd = conn.CreateCommand())语句放到while里面去就不会报这个错了
      

  4.   

    cmd.Parameters.Add(new SqlParameter("@Name", name));
                                    cmd.Parameters.Add(new SqlParameter("@Age", age));
      

  5.   

    为什么我读的名字都是空格的,从头到尾部···我表中 Name的 类型 是 nvarchar(50)类型的哈
      

  6.   


    //public SqlParameter Add(string parameterName, SqlDbType sqlDbType);
    //添加参数
    cmd.CommandText = "insert into Peoples(Name,Age) values(@Name,@Age)";
    cmd.Parameters.Add("@Name", SqlDbType.nvarchar,50);
    cmd.Parameters["@Name"].Value = name;
    cmd.ExecuteNonQuery();是否没设置参数类型~~
    新手~~~勿喷~~~~
      

  7.   


    不是不是,是我的 database 已经建立好了字段 和类型,不用 指定类型了。
    好奇怪,我如果把 我的文件中该生 123 、avc 等英文的形式是没有问题的,但是我不懂的就是,我表中的Name 字段在定义的时候是 nvarchar(50),类型了,应该支持中文的,为什么不行就不懂了。
      

  8.   

    加一句
    cmd.Parameters.Clear()
    cmd.CommandText = "insert into Peoples(Name,Age) values(@Name,@Age)";
      

  9.   

    现在是新的问题了, 前面的问题  The variable name '@Name' has already been declared. Variable names must be unique within a query batch or stored procedure.  我懂为什么了,因为我没有在增加第一个参数前清零第二个参数!
    现在新的问题,就是我的问题如果是中文,我读到表中,显示的都是空格。
    但是我的表中的Name字段是 nvarchar 类型,我就不懂为什么了!
      

  10.   

    调试也找不到那里问题,一开始read的时候,就是空的!
    我去看一下visual studio 的编码看看,怎么看!
      

  11.   

    lz是从txt文件读的数据么? 如果是的话 看下txt的编码 如果是ANSI的可能引起乱码问题 可以改成UTF-8试试
      

  12.   

    嗯 涉及到txt 特别是经过记事本编辑后 经常会有这样的问题 解决了就好