【问题标题】:Sql insert c# windows formsSql 插入 c# windows 窗体
【发布时间】:2020-10-31 05:26:15
【问题描述】:

我正在开发一个带有 sql 数据库的 windows 窗体项目,我想写一些数据,但我不能。 (代码没有给出任何错误,但是没有写入数据。 下面的代码就是我要写入数据的地方:

 public static string stringConnection = @"Data Source=(localdb)\MSSQLLocalDB; AttachDbFilename=|DataDirectory|\POS.mdf; Integrated Security=True";
                    try
                    {
                        mySql = string.Empty;
                        mySql += "INSERT INTO Journal (Date) VALUES (" + "'"+ caisse + "'"+")" ;
                        connection.exsql(mySql);
                    }
                    catch(Exception exx)
                    {
                        MessageBox.Show(exx.ToString());
                    }

这里是connection.exsql方法:

public static void exsql(string sql)
    {
        SqlConnection connection = new SqlConnection();
        SqlDataAdapter adapter = default(SqlDataAdapter);
        try
        {
            connection.ConnectionString = stringConnection;
            connection.Open();
            adapter = new SqlDataAdapter(sql, connection);
            connection.Close();
            //connection = null;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Fatal sql error: " + ex.Message, "Sql Server connection failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

【问题讨论】:

  • 你没有执行任何命令,你只是打开一个连接并创建一个适配器,但什么也不做。研究ExecuteNonQuery
  • 这也是在 .NET 应用程序中处理数据的一种非常古老的方式。现在的方法是使用实​​体框架,虽然它的代码更多,但从长远来看会更好。
  • 总是使用参数来避免sql注入和格式化错误。您的 exsql 方法不提供此功能。
  • @MatthewLayton 该声明非常不完整。你不应该把这样的信息告诉新程序员,他们会认为这是全世界最好的事情。现实情况是,这不仅仅是更多的代码,而且在我所见过的所有情况下,它都对数据性能造成了巨大影响。我们每年都在转换几十个在 EF 上运行而不是普通 SQL 服务的业务应用程序,并且速度提高了 10 倍以上。也许在纸面上看起来不错,但现实告诉我,在过去的 8 年里,我们一直在转换这些

标签: c# sql windows forms winforms


【解决方案1】:

您想使用sqlCommand 并执行.ExecuteNonQuery() 来执行插入或更新。

更多信息here

另外,使用参数化(上面的链接中显示了一个示例),否则,您打开自己到SQL injection,如果您的变量包含单引号,您的代码将失败。

【讨论】:

    【解决方案2】:
    SqlConnection con;
        SqlCommand cmd;
        public bool exsql(string query)
        {       
           try {
                con = null;
                con = new SqlConnection(ConnectionString.path);
                cmd = new SqlCommand(query, con);
                con.Open();
                var rowEffected = cmd.ExecuteNonQuery();
                con.Close();
                if(rowEffected>0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
                }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message, "Exception occurred !", 
               MessageBoxButtons.OK, 
               MessageBoxIcon.Error);
           }
        }
    

    您可以通过 ExecuteNonQuery() 函数执行您的查询

    【讨论】:

    • 这是有效代码;但是,如果 var rowEffected = cmd.ExecuteNonQuery(); 可能会遇到一个问题失败, con.Close() 永远不会被调用。这样做足够多次(> 100 次),您将用完可用的连接。在代码周围使用 using 将缓解这个问题。
    【解决方案3】:

    更少的代码

        private bool exsql(string query)
        { 
            using(var conn = new SqlConnection(ConnectionString.path))
            {
                conn.Open();
                using (var command = new SqlCommand(query, conn)) 
                    return command.ExecuteNonQuery() == 0 ? false : true;  
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2021-12-20
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      相关资源
      最近更新 更多