【问题标题】:Using C# to connect and insert to SQL Server 2012使用 C# 连接和插入 SQL Server 2012
【发布时间】:2014-02-15 18:45:16
【问题描述】:

我正在编写一些代码来尝试获取用户输入的数组以连接并发送到 SQL Server 2012。有人告诉我使用所有这些命令来连接到数据库。

我的一个问题是我一直在查看 Stack Overflow,每个人都建议使用参数而不是连接以避免 SQL 注入,但这是针对我的课程的,我们只有 2 周的 C#,所以我不认为如果我使用参数,他会喜欢的。

我认为我的 try catch 是错误的,上半部分是用红线填充的,你如何使用带有 for 循环的 INSERT 命令?

protected void btnDisplay_Click(object sender, EventArgs e)
{
    //try
    //{
      //  System.Data.SqlClient.SqlConnection varname1 = new System.Data.SqlClient.SqlConnection();
      //  varname1 = "server = LOCALHOST"; Database = Lab1; Trusted_connection = yes;
      //  varname1.Open();
      //  System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
      //  cmd.Connection = conn;
      //  cmd.CommandText = "Delete From Student";
       // cmd.ExecuteNonQuery();
   //    
    string sql = null;
     for(int i=0; counter1 >= i; i++)
     {
         sql += "INSERT into Student VALUES(" + StudentId + Name + Address);
     }
    varname1.Close();
   //}
    catch (SqlException ex)
    {
        MessageBox.Show("Database failed" + ex.Message);
    }
}

【问题讨论】:

  • 哇,从哪里开始......
  • catch 用于修复错误MessageBox.Show 没有修复错误所以你的代码是错误的。
  • 我认为自己进行研究并确保代码安全没有任何问题。另外,您的 try 语句已被注释掉。
  • 你真的应该让开发环境来验证你所拥有的甚至可以编译的代码——其他任何事情都是在浪费 SO 的资源。甚至这里的转储语法高亮显示大部分代码已被注释掉。
  • 关于那些红线。那是 Visual Studio 告诉你有问题。养成的一个好习惯是,一旦你注意到这些问题,就立即解决它们。换句话说,尽早构建,经常构建,当有疑问时,构建。

标签: c# asp.net sql sql-server visual-studio-2010


【解决方案1】:

因此,此代码存在不少问题。最好再花一个小时左右,然后发布您无法弄清楚的任何具体问题。不过,让我给你一些快速的指示。

  1. 您有一个 catch() 块,但匹配的 try 块被注释掉了。这将导致编译器错误。看起来你只是在调试一些东西,所以没什么大不了的。但是,发布您尝试运行的实际代码通常是明智的。

  2. 您正在将一个字符串初始化为null,但您正在连接到末尾。这将导致运行时错误。您应该将字符串初始化为 String.Empty。此外,如果您正在执行大量字符串连接,请查看 StringBuilder 类,因为它要快得多。

  3. 您(理论上)正在构建一个 SQL 字符串,但实际上从未在任何地方运行它。你也不会将值返回给任何可以运行它的东西。

  4. 您的INSERT 声明甚至无效。您在 INSERT 语句中没有匹配的结尾 ),并且您的变量后面有一个流氓 ),这将导致编译器错误。您也只需将所有变量混合在一起,它们之间没有引号或逗号。你可能想要更多类似的东西:

    sql += String.Format("INSERT into Student VALUES('{0}', '{1}', '{2}');", StudentId, Name, Address);

  5. 使用参数化查询。总是。谁在乎你的老师说什么。如果你不这样做,至少,首先检查字符串中的撇号,因为这些会通过过早结束字符串来搞砸你的 SQL 语句。

  6. 您的循环似乎没有多大意义。 counter1 是什么?它有什么价值?即使它设置为正值,您所做的只是一遍又一遍地构建相同的 SQL 字符串,因为循环中的值不会改变。不清楚你想在这里做什么。

  7. 您正在调用varname1.Close();,但您已将varname1 的声明注释掉,这将导致编译器错误。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这就是你所追求的。您可能需要调整其中的一些内容。抱歉,如果它没有完全工作,目前没有调试器。

    class Data {
        public int StudentId {get;set;}
        public string Name {get;set;}
        public string Address {get;set;}
    }
    
    protected void btnDisplay_Click(object sender, EventArgs e)
    {
        var datas = new List<Data>();
        try
        {
            StringBuilder sql = new StringBuilder();
            foreach(data in datas)
            {
                sql.Append(String.Format("INSERT into Student VALUES({0},'{1}','{2}') ",data.UserId,data.Name,data.Address));
            }
    
            var sqlConnection = new SqlConnection(@"Data Source=LOCALHOST;Initial Catalog=Lab1;Trusted_Connection=True;");
            sqlConnection.Open();
            var command = new SqlCommand(sql.ToString(),sqlConnection);
            command..ExecuteNonQuery();
            sqlConnection.Close();
    
        }
        catch(SqlException ex){
            MessageBox.Show("Database failed" + ex.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多