Csharpsss 2018-08-03 06:45 采纳率: 50%
浏览 1044
已采纳

C# winform 增查改删数据库内容 每次进行一个操作都要复制以下代码

cn.Open();
SqlCommand sql = new SqlCommand("select *from rkb where 编码='" + textBox2.Text + "'");
SqlDataAdapter da = new SqlDataAdapter();
DataTable ds = new DataTable();
da.SelectCommand = sql;
da.SelectCommand.Connection = cn;
da.Fill(ds);
this.dataGridView1.DataSource = ds;
sql.ExecuteNonQuery();
cn.Close();

cn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection =cn;
cmd.CommandText = "insert into kcbvalues('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "')";
MessageBox.Show("入库成功");
cmd.ExecuteNonQuery();
cn.Close();

大佬们都怎么优化的  比如建一个类 或者其他办法都可以  能给一小段代码参考下吗      有看到网上的实例发个链接也可以               
  • 写回答

6条回答 默认 最新

  • hxycsdn9159 2018-08-03 07:12
    关注

    封装成一个工具类,根据你的需求需要两个接口就可以了,一个是查询操作返回DataTable,另一个是非查询操作返回整型就可以了,然后传入sql就可以了,现成的数据库连接工具类网上一大堆,例如:https://www.cnblogs.com/AMortal/p/7538443.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • Csharpsss 2018-08-03 06:47
    关注

    感觉我这么搞小程序看不出来 要是数据量大点估计会很慢吧 程序里写满了以上这种代码 感觉很蠢 又不知道怎么弄。。。

    评论
  • 白色一大坨 2018-08-03 06:57
    关注

    老兄虽然我是做c++的,但是你这个cn是数据库的一个对象吧,有必要这么频繁的开关吗,这种开关是不是放在程序的入口和出口就可以了?
    至于封装,你可以把这数据库操作功能直接封装成一个类,增删查改做成类的接口,使用功能时候只要调用接口就可以了,这样不就可以避免大量重复的代码了?

    评论
  • weixin_40852944 2018-08-03 07:20
    关注
     class DbUtils{
        public boolean exec(sql){
            boolean result = false;
            try{
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection =cn; 
                cmd.CommandText = "insert into kcbvalues('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "')";
                result = cmd.ExecuteNonQuery()==1;
                cn.Close();
            }catch(Exception e){
    
            }       
            return result;
        }
    
        public SqlDataAdapter query(string sqlStr){
            cn.Open();
            SqlCommand sql = new SqlCommand(sqlStr);
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable ds = new DataTable();
            da.SelectCommand = sql;
            da.SelectCommand.Connection = cn;
            da.Fill(ds);
            cn.Close();
            return da;
        }
    
    }
    

    最简单的是写一个这样的工具类,把平时用到的增删改查抽象出来,然后sql语句单独传进来执行就行了;
    复杂点的是,找一些现成的持久层框架,这样就不用你自己写创建数据库连接,关闭数据库连接等与业务没关联而又繁琐的事情;
    因为我是java,给你的一个代码里,很有可能会有报错,自己理解意思就行。

    评论
  • 编程压力大 2018-08-03 07:38
    关注

    增/删/改 一个方法, 查询一个方法
    public class databasemanager
    {
    public DataTable query(vSql)
    {
    cn.Open();
    SqlCommand sql = new SqlCommand(vSql);
    SqlDataAdapter da = new SqlDataAdapter();
    DataTable ds = new DataTable();
    da.SelectCommand = sql;
    da.SelectCommand.Connection = cn;

    sql.ExecuteNonQuery();
    da.Fill(ds);
    cn.Close();
    }

    public DataTable save(vSql)
    {
    cn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection =cn;
    cmd.CommandText = vSql;
    cmd.ExecuteNonQuery();
    cn.Close();
    }
    }
    外部调用的时候,如下:
    string vSql = "select * from rkb where 编码='" + textBox2.Text + "'";
    databasemanager newManage = new databasemanager()
    DataTable dtSourct = newManager.query(vSql)
    this.dataGridView1.DataSource = dtSourct;

    评论
  • Zachary_CN 2018-08-09 07:27
    关注

    微软官方SqlHelper工具类,你可以参考下
    下面是我自己以前小项目自用的

     public   class SQLHelper
        {
     private SqlConnection conn = null;
                private SqlCommand cmd = null;
                private SqlDataReader sdr = null;
    
                public SQLHelper()
                {
                    string connStr = ConfigurationManager.AppSettings["connStr"];
                    conn = new SqlConnection(connStr);
                }
    
                private SqlConnection GetConn()
                {
                    if (conn.State == ConnectionState.Closed)
                    {
                        conn.Open();
                    }
                    return conn;
                }
    
    
                /// <summary>
                /// 执行不带参数的的增删改SQL语句或者存储过程
                /// </summary>
                /// <param name="cmdText">增删改查SQL</param>
                /// <param name="ct">命令类型</param>
                /// <returns>返回受影响的行数</returns>
                public int ExecuteNonQuery(string cmdText, CommandType ct)
                {
                    int res;
                    try
                    {
                        cmd = new SqlCommand(cmdText, GetConn());
                        cmd.CommandType = ct;
                        res = cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
    
                        throw ex;
                    }
                    finally
                    {
                        if (conn.State == ConnectionState.Open)
                        {
                            conn.Close();
                        }
    
                    }
                    return res;
                }
    
                /// <summary>
                /// 执行带参数的的增删改SQL语句或者存储过
                /// </summary>
                /// <param name="cmdText">增删改查SQL</param>
                /// <param name="paras">要查询的参数</param>
                /// <param name="ct">命令类型</param>
                /// <returns>返回受影响的行数</returns>
                public int ExecutenQuery(string cmdText, SqlParameter[] paras, CommandType ct)
                {
                    int res;
                    using (cmd = new SqlCommand(cmdText, GetConn()))
                    {
                        cmd.CommandType = ct;
                        cmd.Parameters.AddRange(paras);
                        res = cmd.ExecuteNonQuery();
                    }
                    return res;
                }
    
    
                /// <summary>
                ///  执行不带参数的查询SQL语句或存储过程
                /// </summary>
                /// <param name="cmdText">查询SQL语句或存储过程</param>
                /// <param name="ct">命令类型</param>
                /// <returns></returns>
                public DataTable ExecuteQuery(string cmdText, CommandType ct)
                {
                    DataTable dt = new DataTable();
                    cmd = new SqlCommand(cmdText, GetConn());
                    cmd.CommandType = ct;
                    using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        dt.Load(sdr);
                    }
                    return dt;
                }
    
    
                /// <summary>
                /// 执行带参数的查询SQL语句或存储过程
                /// </summary>
                /// <param name="cmdText">查询SQL语句或存储过程</param>
                /// <param name="paras">参数集合</param>
                /// <param name="ct">命令类型</param>
                /// <returns></returns>
                public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
                {
                    DataTable dt = new DataTable();
                    cmd = new SqlCommand(cmdText, GetConn());
    
                    cmd.CommandType = ct;
                    cmd.Parameters.AddRange(paras);
                    using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        dt.Load(sdr);
                    }
                    return dt;
                }
            }
        }
    
    
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 MICE包多重插补后数据集汇总导出
  • ¥15 一道算法分析问题(关于3-MSAT)
  • ¥15 C++ FLUENT 化学反应速率 编写困难
  • ¥15 Python嵌套交叉验证
  • ¥20 有关于C# Winform的问题
  • ¥15 linuxkit+elasticsearch
  • ¥15 兄得萌6.13do题😭😭大一小东西的work
  • ¥15 投不到原始数据,gdal投影代码
  • ¥20 卷积混响的代码帮写。。
  • ¥88 借助代码处理雷达影像,识别任意区域洪水前后的被淹没区域,并可视化展示。