通用数据库操作辅助类DbHelper

http://www.cnblogs.com/yelaiju/archive/2010/09/22/1832916.html

 

使用方式
DbHelper db;
OpenFileDialog ofd 
=   new  OpenFileDialog();
ofd.Filter 
=   " SQLite数据文件(*.db3;*.db;*.sqlite)|*.db3;*.db;*.sqlite " ;
if  (ofd.ShowDialog()  ==  DialogResult.OK)
{
    txtDataSource.Text 
=  ofd.FileName;
    db 
=   new  DbHelper( " data source= "   +  txtDataSource.Text, DbProvider.Sqlite);
}
db.ReExNum(txtSql.Text); 

接口
using  System.Data;
using  System.Collections.Generic;
using  System.Data.Common;

///   <summary>
///  该类用于对数据库进行操作
///  Design by 火地晋
///   </summary>
namespace  System.Data
{
    
public   interface  IDbObject
    {
        
///   <summary>
        
///  定义一个DataReader的列表,已备检索
        
///   </summary>
        List < DbDataReader >  DataReaderList {  get set ; }
        
///   <summary>
        
///  
        
///   </summary>
        DbConnection Connection {  get set ; }
        
string  ConnectionString {  get set ; }
        DbProvider DbProviderType { 
get set ; }
        
        
///   <summary>
        
///  返回执行操作成功的数目,使用注意,如果是存储过程,必须在存储过程后加上:select @@ROWCOUNT
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         int  ReExNum( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  返回结果的存储过程
        
///   </summary>
        
///   <param name="strSql"> 任何SQL语句 </param>
        
///   <param name="parameters"> 参数值 </param>
        
///   <returns></returns>
        DbDataReader ReSelectdr( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  返回dateSet
        
///   </summary>
        
///   <param name="strSql"></param>
        
///   <param name="parameters"></param>
        
///   <param name="tableName"></param>
        
///   <returns></returns>
        DataSet ReSelectds( string  strSql,  string  tableName,  params  DbParameter[] parameters);
        DataTable ReSelectdtb(
string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  通過存儲過程及自定義參數組查詢返回SqlDataAdapter對象
        
///   </summary>
        DbDataAdapter ReSelectdat( string  strSql,  params  DbParameter[] parameters);

        
void  ExSQL( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///      執行SQL查詢語句,返回記錄條數
        
///   </summary>
        
///   <param name="strSql"> Select語句(在select语句中,使用Count(*)函数) </param>
        
///   <returns> 返回查詢到之記錄條數 </returns>
         int  ReSelectNum( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  使用SqlDataAdapter返回指定范围的数据
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数名 </param>
        
///   <param name="start"> 起始行 </param>
        
///   <param name="maxRecord"> 记录数 </param>
        
///   <param name="tableName"> 表名 </param>
        
///   <returns></returns>
        DataSet ReSelectds( string  strSql, DbParameter[] parameters,  int  start,  int  maxRecord,  string  tableName);
        
///   <summary>
        
///  返回执行操作成功的数目,不关闭连接
        
///   </summary>
        
///   <param name="strSql"> 执行的查询语句或存储过程 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         int  ReExNumNoClose( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  返回执行操作成功的数目,不关闭连接,并返回出现的错误信息。
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         int  ReExNumNoClose( string  strSql,  out   string  error,  params  DbParameter[] parameters);

        
///   <summary>
        
///  返回执行操作成功的数目,并返回发生的错误信息
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         int  ReExNum( string  strSql,  out   string  error,  params  DbParameter[] parameters);

        
///   <summary>
        
///  返回执行操作结果的信息,如果返回为空则表示没错误,否则返回错误的信息。
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         string  ReExStr( string  strSql,  params  DbParameter[] parameters);
        
///   <summary>
        
///  如果数据库连接已关闭,则打开
        
///   </summary>
        
///   <returns></returns>
         bool  OpenConnection();
        
///   <summary>
        
///  关闭数据库连接
        
///   </summary>
         void  CloseConnection();
    }
    
public   enum  DbProvider
    {
        Sql
= 0 ,
        Sqlite
= 1 ,
        OleDb
= 2 ,
        Oracle
= 3 ,
        MySql
= 4
    }
}
 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Data.Common;

namespace  System.Data
{
    
public   class  DbHelper : IDbObject
    {
        
#region  属性
        
public  List < DbDataReader >  DataReaderList {  get set ; }
        
public  DbConnection Connection {  get set ; }
        
public   string  ConnectionString {  get set ; }
        
public  DbProvider DbProviderType {  get set ; }
        
private  DbProviderFactory dbFactory;
        
#endregion

        
#region  构造函数
        
public  DbHelper()
        {
            DbHelperInstance(System.Configuration.ConfigurationManager.AppSettings[
" ConnectionString " ], DbProvider.Sql);
        }
        
public  DbHelper( string  connectionString)
        {
            DbHelperInstance(connectionString, DbProvider.Sql);
        }
        
public  DbHelper(DbProvider dbProviderType)
        {
            DbHelperInstance(System.Configuration.ConfigurationManager.AppSettings[
" ConnectionString " ], dbProviderType);
        }
        
public  DbHelper( string  connectionString, DbProvider dbProviderType)
        {
            DbHelperInstance(connectionString, dbProviderType);
        }
        
///   <summary>
        
///  初始化
        
///   </summary>
        
///   <param name="connectionString"></param>
        
///   <param name="dbProviderType"></param>
         public   void  DbHelperInstance( string  connectionString, DbProvider dbProviderType)
        {
            
this .DbProviderType  =  dbProviderType;
            
this .ConnectionString  =  connectionString;
            DataReaderList 
=   new  List < DbDataReader > ();
            CreateFactory();
            
this .Connection  =   this .dbFactory.CreateConnection();
            
this .Connection.ConnectionString  =   this .ConnectionString;
        }
        
#endregion
        
///   <summary>
        
///  创建数据操作工厂
        
///   </summary>
         private   void  CreateFactory()
        {
            
switch  (DbProviderType)
            {
                
case  DbProvider.Sql:
                    
this .dbFactory  =  System.Data.SqlClient.SqlClientFactory.Instance;
                    
break ;
                
case  DbProvider.Sqlite:
                    
this .dbFactory  =  System.Data.SQLite.SQLiteFactory.Instance;
                    
break ;
                
case  DbProvider.OleDb:
                    
this .dbFactory  =  System.Data.OleDb.OleDbFactory.Instance;
                    
break ;
                
case  DbProvider.Oracle:
                    
this .dbFactory  =  System.Data.OracleClient.OracleClientFactory.Instance;
                    
break ;
                
case  DbProvider.MySql:
                    
this .dbFactory  =  MySql.Data.MySqlClient.MySqlClientFactory.Instance;
                    
break ;
            }
        }
        
///   <summary>
        
///  创建操作对象
        
///   </summary>
        
///   <param name="procNameOrExText"> 如果包含@,则采用CommandType.Text </param>
        
///   <param name="parameters"></param>
        
///   <returns></returns>
         private  DbCommand BuilderQueryCommand( string  procNameOrExText,  params  DbParameter[] parameters)
        {
            
if  (parameters  ==   null   ||  parameters.Length  ==   0 )
            {
                DbCommand command 
=   this .dbFactory.CreateCommand();
                command.CommandText 
=  procNameOrExText;
                command.Connection 
=   this .Connection;
                
return  command;
            }
            
if  (procNameOrExText.IndexOf( ' @ ' >   0 ) // 存储过程
            {
                
return  BuilderQueryCommandText(procNameOrExText, parameters);
            }
            
else
            {
                
return  BuilderQueryCommandStorPro(procNameOrExText, parameters);
            }
        }

        
///   <summary>
        
///  根据存储过程名称和参数生成对应的SQL命令对象
        
///   </summary>
        
///   <param name="strSql"> 存储过程名或者 </param>
        
///   <param name="parameters"> 存储过程参数 </param>
        
///   <returns></returns>
         private  DbCommand BuilderQueryCommandStorPro( string  strSql,  params  DbParameter[] parameters)
        {
            DbCommand command 
=   this .dbFactory.CreateCommand();
            command.CommandText 
=  strSql;
            command.CommandType 
=  CommandType.StoredProcedure;
            command.Connection 
=   this .Connection;
            
if  (parameters  !=   null )
            {
                
foreach  (DbParameter p  in  parameters)
                {
                    command.Parameters.Add(p);
                }
            }
            
return  command;
        }
        
private  DbCommand BuilderQueryCommandText( string  strSql,  params  DbParameter[] parameters)
        {
            DbCommand command 
=   this .dbFactory.CreateCommand();
            command.CommandText 
=  strSql;
            command.Connection 
=   this .Connection;
            
if  (parameters  !=   null )
            {
                
foreach  (DbParameter p  in  parameters)
                {
                    command.Parameters.Add(p);
                }
            }
            
return  command;
        }
        
public  DbParameter CreateDbParameter( string  parameterName)
        {
            
return  CreateDbParameter(parameterName, DBNull.Value, DbType.Object,  0 , ParameterDirection.Input);
        }
        
public  DbParameter CreateDbParameter( string  parameterName,  object  value)
        {
            
return  CreateDbParameter(parameterName, value, DbType.Object,  0 , ParameterDirection.Input);
        }
        
public  DbParameter CreateDbParameter( string  parameterName,  object  value, DbType dbType)
        {
            
return  CreateDbParameter(parameterName,value,dbType, 0 ,ParameterDirection.Input);
        }
        
public  DbParameter CreateDbParameter( string  parameterName,  object  value, DbType dbType,  int  size)
        {
            
return  CreateDbParameter(parameterName,value,dbType,size,ParameterDirection.Input);
        }
        
public  DbParameter CreateDbParameter( string  parameterName,  object  value, DbType dbType,  int  size, ParameterDirection parameterDirection)
        {
            DbParameter pat 
=   this .dbFactory.CreateParameter();
            pat.ParameterName 
=  parameterName;
            pat.Value 
=  value;
            pat.DbType 
=  dbType;
            pat.Size 
=  size;
            pat.Direction 
=  parameterDirection;
            
return  pat;
        }
        
///   <summary>
        
///  返回执行操作成功的数目,使用注意,如果是存储过程,必须在存储过程后加上:select @@ROWCOUNT
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         public   int  ReExNum( string  strSql,  params  DbParameter[] parameters)
        {
            
int  effect  =   0 ;
            
if  ( ! OpenConnection())  return   - 1 ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                
// 根据是否为存储过程来执行不同的处理
                 if  (cmd.CommandType  ==  CommandType.StoredProcedure)
                {
                    
object  result  =  cmd.ExecuteScalar();
                    effect 
=  result  ==   null   ?   - 1  : Convert.ToInt16(result);
                }
                
else
                {
                    effect 
=  cmd.ExecuteNonQuery();
                }
                trans.Commit();
                
return  effect;
            }
            
catch
            {
                trans.Rollback();
                Connection.Close();
                
return   - 1 ;
            }
            
finally
            {
                Connection.Close();
            }
        }
        
///   <summary>
        
///  返回结果的存储过程
        
///   </summary>
        
///   <param name="strSql"> 任何SQL语句 </param>
        
///   <param name="parameters"> 参数值 </param>
        
///   <returns></returns>
         public  DbDataReader ReSelectdr( string  strSql,  params  DbParameter[] parameters)
        {
            
try
            {
                DbDataReader reader;
                
if  ( ! OpenConnection())  return   null ;
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                reader 
=  cmd.ExecuteReader(CommandBehavior.CloseConnection); // 在dr关闭之后,就不需要进行cnn的关闭操作了
                DataReaderList.Add(reader); // 添加进dr列表,已备检索
                 return  reader;
            }
            
catch
            {
                
return   null ;
            }
        }
        
///   <summary>
        
///  返回dateSet
        
///   </summary>
        
///   <param name="strSql"></param>
        
///   <param name="parameters"></param>
        
///   <param name="tableName"></param>
        
///   <returns></returns>
         public  DataSet ReSelectds( string  strSql,  string  tableName,  params  DbParameter[] parameters)
        {
            
try
            {
                DataSet ds 
=   new  DataSet();
                
if  ( ! OpenConnection())  return   null ;
                DbDataAdapter myDa 
=   this .dbFactory.CreateDataAdapter();
                myDa.SelectCommand 
=  BuilderQueryCommand(strSql, parameters);
                myDa.Fill(ds, tableName);
                
return  ds;
            }
            
catch
            {
                
return   null ;
            }
            
finally
            {
                Connection.Close();
            }
        }
        
public  DataTable ReSelectdtb( string  strSql,  params  DbParameter[] parameters)
        {
            
try
            {
                DataTable dt 
=   new  DataTable();
                
if  ( ! OpenConnection())  return   null ;
                DbDataAdapter myDa 
=   this .dbFactory.CreateDataAdapter();
                myDa.SelectCommand 
=  BuilderQueryCommand(strSql, parameters);
                myDa.Fill(dt);
                
return  dt;
            }
            
catch
            {
                
return   null ;
            }
            
finally
            {
                Connection.Close();
            }
        }
        
///   <summary>
        
///  通過存儲過程及自定義參數組查詢返回SqlDataAdapter對象
        
///   </summary>
         public  DbDataAdapter ReSelectdat( string  strSql,  params  DbParameter[] parameters)
        {
            
if  ( ! OpenConnection())  return   null ;
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                DbDataAdapter myDa 
=   this .dbFactory.CreateDataAdapter();
                myDa.SelectCommand 
=  cmd;
                
return  myDa;
            }
            
catch
            {
                Connection.Close();
                
return   null ;
            }
        }

        
public   void  ExSQL( string  strSql,  params  DbParameter[] parameters)
        {
            
if  ( ! OpenConnection())  return ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                cmd.ExecuteNonQuery();
                trans.Commit();
            }
            
catch
            {
                trans.Rollback();
                Connection.Close();
                
return ;
            }
            
finally
            {
                Connection.Close();
            }
        }
        
///   <summary>
        
///   執行SQL查詢語句,返回記錄條數
        
///   </summary>
        
///   <param name="strSql"> Select語句(在select语句中,使用Count(*)函数) </param>
        
///   <returns> 返回查詢到之記錄條數 </returns>
         public   int  ReSelectNum( string  strSql,  params  DbParameter[] parameters)
        {
            
int  effect  =   0 ;
            
try
            {
                DbDataReader dr 
=  ReSelectdr(strSql, parameters);
                
if  (dr.Read())
                {
                    effect 
=  Convert.ToInt32(dr.GetValue( 0 ));
                }
                
return  effect;
            }
            
catch
            {
                
return  effect;

            }
        }
        
///   <summary>
        
///  使用SqlDataAdapter返回指定范围的数据
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数名 </param>
        
///   <param name="start"> 起始行 </param>
        
///   <param name="maxRecord"> 记录数 </param>
        
///   <param name="tableName"> 表名 </param>
        
///   <returns></returns>
         public  DataSet ReSelectds( string  strSql, DbParameter[] parameters,  int  start,  int  maxRecord,  string  tableName)
        {
            
try
            {
                DataSet ds 
=   new  DataSet();
                OpenConnection();
                DbDataAdapter myDa 
=   this .dbFactory.CreateDataAdapter();
                myDa.SelectCommand 
=  BuilderQueryCommand(strSql, parameters);
                myDa.Fill(ds, start, maxRecord, tableName);
                
return  ds;
            }
            
catch
            {
                Connection.Close();
                
return   null ;
            }
            
finally
            {
                Connection.Close();
            }
        }
        
///   <summary>
        
///  返回执行操作成功的数目,不关闭连接
        
///   </summary>
        
///   <param name="strSql"> 执行的查询语句或存储过程 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         public   int  ReExNumNoClose( string  strSql,  params  DbParameter[] parameters)
        {
            
int  effect  =   0 ;
            
if  ( ! OpenConnection())  return   - 1 ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                
// 根据是否为存储过程来执行不同的处理
                 if  (cmd.CommandType  ==  CommandType.StoredProcedure)
                {
                    
object  result  =  cmd.ExecuteScalar();
                    effect 
=  result  ==   null   ?   - 1  : Convert.ToInt16(result);
                }
                
else
                {
                    effect 
=  cmd.ExecuteNonQuery();
                }
                trans.Commit();
                
return  effect;
            }
            
catch
            {
                trans.Rollback();
                
return  effect;
            }
        }
        
///   <summary>
        
///  返回执行操作成功的数目,不关闭连接,并返回出现的错误信息。
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         public   int  ReExNumNoClose( string  strSql,  out   string  error,  params  DbParameter[] parameters)
        {
            
int  effect  =   0 ;
            error 
=   "" ;
            
if  ( ! OpenConnection())  return   - 1 ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                
if  (cmd.CommandType  ==  CommandType.StoredProcedure)
                {
                    
object  result  =  cmd.ExecuteScalar();
                    effect 
=  result  ==   null   ?   - 1  : Convert.ToInt16(result);
                }
                
else
                {
                    effect 
=  cmd.ExecuteNonQuery();
                }
                effect 
=  cmd.ExecuteNonQuery();
                trans.Commit();
                
return  effect;
            }
            
catch  (Exception ex)
            {
                trans.Rollback();
                error 
=  ex.Message;
                
return  effect;
            }
        }

        
///   <summary>
        
///  返回执行操作成功的数目,并返回发生的错误信息
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         public   int  ReExNum( string  strSql,  out   string  error,  params  DbParameter[] parameters)
        {
            
int  effect  =   0 ;
            error 
=   "" ;
            
if  ( ! OpenConnection())  return   - 1 ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                
if  (cmd.CommandType  ==  CommandType.StoredProcedure)
                {
                    
object  result  =  cmd.ExecuteScalar();
                    effect 
=  result  ==   null   ?   - 1  : Convert.ToInt16(result);
                }
                
else
                {
                    effect 
=  cmd.ExecuteNonQuery();
                }
                trans.Commit();
                
return  effect;
            }
            
catch  (Exception ex)
            {
                trans.Rollback();
                error 
=  ex.Message;
                
return  effect;
            }
            
finally
            {
                Connection.Close();
            }
        }

        
///   <summary>
        
///  返回执行操作结果的信息,如果返回为空则表示没错误,否则返回错误的信息。
        
///   </summary>
        
///   <param name="strSql"> 存储过程名 </param>
        
///   <param name="parameters"> 参数组 </param>
        
///   <returns></returns>
         public   string  ReExStr( string  strSql,  params  DbParameter[] parameters)
        {
            
string  error  =   string .Empty;
            
int  effect  =   0 ;
            
if  ( ! OpenConnection())  return   null ;
            DbTransaction trans 
=  Connection.BeginTransaction();
            
try
            {
                DbCommand cmd 
=  BuilderQueryCommand(strSql, parameters);
                cmd.Transaction 
=  trans;
                effect 
=  cmd.ExecuteNonQuery();
                trans.Commit();
                
if  (effect  ==   0 )
                {
                    error 
=   " 操作成功记录数为0,请检查意外的错误。 "   +   "  sql语句: "   +  strSql;
                }
                
else
                {
                    error 
=   "" ;
                }
            }
            
catch  (Exception ex)
            {
                trans.Rollback();
                error 
=   " sql语句: "   +  strSql  +   "  错误信息: "   +  ex.Message;
            }
            
finally
            {
                Connection.Close();
            }
            
return  error;
        }
        
///   <summary>
        
///  如果数据库连接已关闭,则打开
        
///   </summary>
        
///   <returns></returns>
         public   bool  OpenConnection()
        {
            
if  (Connection.State  ==  ConnectionState.Closed)
            {
                
try
                {
                    Connection.Open();
                }
                
catch
                {
                    
return   false ;
                }
            }
            
return   true ;
        }
        
public   void  CloseConnection()
        {
            Connection.Close();
        }
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个基于 JDBC 的 DBHelper 辅助的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBHelper { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/database_name"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; private Connection conn; private PreparedStatement ps; private ResultSet rs; public DBHelper() { try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public ResultSet executeQuery(String sql, Object... params) throws SQLException { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } rs = ps.executeQuery(); return rs; } public int executeUpdate(String sql, Object... params) throws SQLException { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } return ps.executeUpdate(); } public void close() { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } ``` 这个 DBHelper 包含了连接数据库、执行查询和更新操作、关闭数据库连接等常用方法。使用时,只需实例化 DBHelper ,然后调用其中的方法即可。例如: ```java DBHelper dbHelper = new DBHelper(); try { ResultSet rs = dbHelper.executeQuery("SELECT * FROM table_name WHERE column_name = ?", "value"); while (rs.next()) { // 处理查询结果 } } catch (SQLException e) { e.printStackTrace(); } finally { dbHelper.close(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值