java mysql dbhelper_dbhelper-DBHelper,使用

本教程分享:《dbhelper》,

DBHelper类

求一个完整的DBHelper类,最好是写上每一步的注释,哪一步是干嘛的,求代码,求高手,如有请给我贴上,分不多不胜感激。...

求一个完整的DBHelper类,最好是写上每一步的注释,哪一步是干嘛的 ,求代码,求高手,如有请给我贴上,分不多 不胜感激 。

sql的

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Data;

using System.Configuration;

namespace DAL

{

public class SqlHelper

{

public static string cons = ConfigurationManager.ConnectionStrings["AliCon"].ConnectionString;

///

/// one

///

/// sql

/// object

public static object ExeOnlyOne(string sqlcmd)

{

object oRs = null;

using(SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

con.Open();

oRs = cmd.ExecuteScalar();

con.Close();

}

return oRs;

}

public static object ExeOnlyOne(string sqlcmd,params SqlParameter[] pars)

{

object oRs = null;

using (SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

cmd.Parameters.AddRange(pars);

con.Open();

oRs = cmd.ExecuteScalar();

con.Close();

}

return oRs;

}

///

/// insert update delete

///

/// sql

/// int

public static int ExeCUD(string sqlcmd)

{

int iRs = -1;

using (SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

con.Open();

iRs = cmd.ExecuteNonQuery();

con.Close();

}

return iRs;

}

public static int ExeCUD(string sqlcmd,params SqlParameter[] pars)

{

int iRs = -1;

using (SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

cmd.Parameters.AddRange(pars);

con.Open();

iRs = cmd.ExecuteNonQuery();

con.Close();

}

return iRs;

}

///

/// all

///

/// sql

/// DataTable

public static DataTable ExeAll(string sqlcmd)

{

DataTable dt = null;

using (SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlDataAdapter sda = new SqlDataAdapter(sqlcmd,con);

DataSet ds = new DataSet();

sda.Fill(ds);

dt = ds.Tables[0];

}

return dt;

}

public static DataTable ExeAll(string sqlcmd,params SqlParameter[] pars)

{

DataTable dt = null;

using (SqlConnection con = new SqlConnection())

{

con.ConnectionString = cons;

SqlDataAdapter sda = new SqlDataAdapter(sqlcmd, con);

sda.SelectCommand.Parameters.AddRange(pars);

DataSet ds = new DataSet();

sda.Fill(ds);

dt = ds.Tables[0];

}

return dt;

}

///

/// all

///

/// sql

/// SqlDataReader

public static SqlDataReader ExeReader(string sqlcmd)

{

SqlConnection con = new SqlConnection();

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

con.Open();

SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return sdr;

}

public static SqlDataReader ExeReader(string sqlcmd,params SqlParameter[] pars)

{

SqlConnection con = new SqlConnection();

con.ConnectionString = cons;

SqlCommand cmd = new SqlCommand(sqlcmd, con);

cmd.Parameters.AddRange(pars);

con.Open();

SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return sdr;

}

}

}

access的

using System;

using System.Data;

using System.Data.OleDb;

using System.Configuration;

namespace DAL

{

///

/// OLEDBHelper 的摘要说明

///

public class OLEDBHelper

{

///

/// 连接数据库字符串

///

public static string strCon = ConfigurationManager.ConnectionStrings["DemoCon"].ConnectionString;

///

/// 执行得到一行一列

///

/// sql语句

/// object对象

public static object ExeOnlyOne(string sqlText)

{

object oRs = null;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.CommandText = sqlText;

cmd.Connection = con;

con.Open();

oRs = cmd.ExecuteScalar();

con.Close();

}

return oRs;

}

///

/// 重载ExecuteOnlyOne

///

/// 命令

/// 参数【个数不定】

///

public static object ExeOnlyOne(string sqlText, params OleDbParameter[] pars)

{

object oRs = null;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.CommandText = sqlText;

cmd.Connection = con;

cmd.Parameters.AddRange(pars);

con.Open();

oRs = cmd.ExecuteScalar();

con.Close();

}

return oRs;

}

///

/// 执行Insert update delete语句

///

/// sql语句

/// 受影响行数

public static int ExeCUD(string sqlText)

{

int iRs = 0;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.CommandText = sqlText;

cmd.Connection = con;

con.Open();

iRs = cmd.ExecuteNonQuery();

con.Close();

}

return iRs;

}

///

/// 执行带参数的Insert update delete语句

///

/// sql语句

/// 参数

/// 受影响行数

public static int ExeCUD(string sqlText, params OleDbParameter[] pars)

{

int iRs = 0;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.CommandText = sqlText;

cmd.Connection = con;

cmd.Parameters.AddRange(pars);

con.Open();

iRs = cmd.ExecuteNonQuery();

con.Close();

}

return iRs;

}

///

/// 查询多条结果

///

/// sql语句

/// DataTable

public static DataTable ExeAll(string sqlText)

{

DataTable dtRs = null;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbDataAdapter sda = new OleDbDataAdapter();

sda.SelectCommand = new OleDbCommand(sqlText, con);

DataSet ds = new DataSet();

sda.Fill(ds);

dtRs = ds.Tables[0];

}

return dtRs;

}

///

/// 查询带参的多条结果

///

/// sql语句

/// 参数

/// DataTable

public static DataTable ExeAll(string sqlText, params OleDbParameter[] pars)

{

DataTable dtRs = null;

using (OleDbConnection con = new OleDbConnection())

{

con.ConnectionString = strCon;

OleDbDataAdapter sda = new OleDbDataAdapter();

sda.SelectCommand = new OleDbCommand(sqlText, con);

sda.SelectCommand.Parameters.AddRange(pars);

DataSet ds = new DataSet();

sda.Fill(ds);

dtRs = ds.Tables[0];

}

return dtRs;

}

///

/// 游标读取数据SqlDataReader

///

/// 语句

/// OleDbDataReader

public static OleDbDataReader ExeReader(string sqlText)

{

OleDbDataReader sdrRs = null;

OleDbConnection con = new OleDbConnection();

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.Connection = con;

cmd.CommandText = sqlText;

con.Open();

sdrRs = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return sdrRs;

}

///

/// 带参reader的sql语句执行

///

/// 语句

/// 参数

/// OleDbDataReader

public static OleDbDataReader ExeReader(string sqlText, params OleDbParameter[] pars)

{

OleDbDataReader sdrRs = null;

OleDbConnection con = new OleDbConnection();

con.ConnectionString = strCon;

OleDbCommand cmd = new OleDbCommand();

cmd.Connection = con;

cmd.CommandText = sqlText;

cmd.Parameters.AddRange(pars);

con.Open();

sdrRs = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return sdrRs;

}

}

}

实现继承 SQLiteOpenHelper 类的 dbHelper 类?

移动应用开发怎么实现继承SQLiteOpenHelper类的dbHelper类?...

移动应用开发怎么实现继承 SQLiteOpenHelper 类的 dbHelper 类?

.NET DBHelper 类的调用问题

DBHelper类怎么调用呢,在百度有说直接调用的,还有找DBHelper类代码的难道是先写好代码才可以用吗,还是在调用前要做一些操作引用呢。我直接调用是报错的呀,请大侠指教...

DBHelper 类 怎么调用呢 ,在百度有说直接调用的,还有找DBHelper 类代码的

难道是先写好代码才可以用吗,还是在调用前要做一些操作引用呢。

我直接调用是报错的呀,请大侠指教

如果你是三层架构的,那么DBHelper一般会放在DAL数据层。

一般用到DBHelper也就在数据层了,同一个层不需要引用,如果这个DBHelper是静态类的话,那么类名.方法或属性就可以直接调用了。

如果不是静态类,那么用的时候NEW个对象出来再调用DBHelper的相关方法或属性就可以了。

备注:如果你使用DBHelper类的位置和DBHelper所在的位置不在同一个类库下,那么这个时候是需要引用DBHelper类所在的这个类库的。

老大太高深了 我自己研究的.net 就是跳转窗口刚弄明白的水平,

做了一个方法

直接调用,报错

能说的初级的知识吗 麻烦了谢谢

资料提供的DBHelper 抄了一遍 报错k

m

追答

三2句也说不请,留个联系方式,我加你。

android程序数据库问题... DBHelper helper = new ...

DBHelper是我重写的类,单独建立了一个DBHelper.java用来说明数据库,然后实例化了一个数据库,DB_NAME应该同oncreat(SQLiteDatabase***)里的***一致吧?version的值是啥呀?...还有实...

DBHelper是我重写的类,单独建立了一个DBHelper.java用来说明数据库,然后实例化了一个数据库,DB_NAME应该同oncreat(SQLiteDatabase ***)里的***一致吧?version的值是啥呀?...

还有实例化数据库以后,写个这个:SQLiteDatabase db = carhelper.getWritableDatabase(); 在多个.java文件中实行数据库操作是都指向同一个数据库吗?

真是纠结了,跪求帮助

DBHelper helper = new DBHelper(this, DB_NAME, null, VERSION); 应该写在哪里啊?老是报错

提示DB_NAME和VERSION不能被定义成变量,可是我看很多源码都是这么写的...帮帮我吧...这句话怎么写呀?DB_NAME和VERSION是前面要定义还是就这么写呀?

展开

这里用ContentProvider方法来定义数据库。。

public class AlarmProvider extends ContentProvider //

{

private static final String DB_NAME = "Alarm.db"; //数据库名

private static final int DB_VERSION = 1;//版本号,当程序第一次运行时,数据库被建立,如果

//你更改了数据库,如增加一个表,这时,这个值一般要改一下,这样程序再次安装运行

//时,数据库可自行升级。。如果不改通常要手动删除数据库。。

private static final String ALARM_TABLE_NAME = "alarm"; //一个表名

private static final int ALARM = 1; //与表对应的整数值,相当于id

private static UriMatcher mUriMathcer; //Uri匹配器,建立uri,表名,id三者之间的关系,如下:

static{

mUriMathcer = new UriMatcher(UriMatcher.NO_MATCH);

mUriMathcer.addURI(AlarmInfo.AUTH, "alarm", ALARM);

}

private interface CreateTableInterface //表创建接口

{

public abstract void createAlarmTable(SQLiteDatabase db);

}

//内部类,数据库助手类,并实现表创建接口

private static class DatabaseHelper extends SQLiteOpenHelper implements CreateTableInterface

{

CreateTableInterface mCreateTableInterface = this;

Context mContext = null;

//构造函数,该函数调用后,数据库没有

//创建。。也就是下面的onCreate不会在它调用后就立即调用创建db

public DatabaseHelper(Context context)

{

super(context, DB_NAME, null, DB_VERSION);

// Log.i(TAG, "DatabaseHelper be called!");

mContext = context;

}

@Override

public void onCreate(SQLiteDatabase db) //这个方法只在第一次db连接创建db时调用,只一次

{

//create db table

mCreateTableInterface.createAlarmTable(db);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) //db升级时调用

{

// Log.i(TAG, "onUpgrade() be called!");

db.execSQL("DROP TABLE IF EXISTS "+ALARM_TABLE_NAME);

onCreate(db);

}

@Override

public void createAlarmTable(SQLiteDatabase db)

{

// 创建表

db.execSQL("CREATE TABLE "+ALARM_TABLE_NAME+" ("

+AlarmInfo._ID+" INTEGER PRIMARY KEY,"

+AlarmInfo._LABEL+" TEXT NOT NULL,"

+AlarmInfo._TIME+" TEXT NOT NULL,"

+AlarmInfo._ALERT+" TEXT NOT NULL,"

+AlarmInfo._REPEAT+" TEXT NOT NULL,"

+AlarmInfo._ACTIVE+" TEXT NOT NULL"

+");");

//在表中插入一些数据。。。

db.execSQL("INSERT INTO "+ALARM_TABLE_NAME+"("+AlarmInfo._LABEL+","

+AlarmInfo._TIME+","+AlarmInfo._ALERT+","

+AlarmInfo._REPEAT+","+AlarmInfo._ACTIVE+

") VALUES('Lunch Alarm','11 : 45 AM','"+Tag.TONE+"','"+Tag.EVERY_DAY+"','false');");

db.execSQL("INSERT INTO "+ALARM_TABLE_NAME+"("+AlarmInfo._LABEL+","

+AlarmInfo._TIME+","+AlarmInfo._ALERT+","

+AlarmInfo._REPEAT+","+AlarmInfo._ACTIVE

+") VALUES('Work Alarm','08 : 45 AM','"+Tag.TONE+"',"+"'Mon,Tue,Wed,Thu,Fri'"

+",'false');");

db.execSQL("INSERT INTO "+ALARM_TABLE_NAME+"("+AlarmInfo._LABEL+","

+AlarmInfo._TIME+","+AlarmInfo._ALERT+","+AlarmInfo._REPEAT+","

+AlarmInfo._ACTIVE

+") VALUES('Work Alarm','09 : 00 AM','"+Tag.TONE+"',"

+"'"+Tag.WEEKENDS+"','false');");

db.execSQL("INSERT INTO "+ALARM_TABLE_NAME+"("+AlarmInfo._LABEL+","

+AlarmInfo._TIME+","+AlarmInfo._ALERT+","+AlarmInfo._REPEAT+","

+AlarmInfo._ACTIVE

+") VALUES('Yoga','10 : 15 PM','"+Tag.TONE+"',"+"'Sun,Wed','false');");

}

}

}

private DatabaseHelper mDatabaseHelper; //定义helper

//以下重写insert,delete,update,query等方法

@Override

public synchronized int delete(Uri uri, String selection, String[] selectionArgs)

{

SQLiteDatabase db = null;

boolean success = false;

int count = 0;

try{

db = mDatabaseHelper.getWritableDatabase();

db.acquireReference();

success = true;

switch(mUriMathcer.match(uri)){

case ALARM:

count = db.delete(ALARM_TABLE_NAME, selection, selectionArgs);

break;

}

}catch(SQLException e){

e.printStackTrace();

}finally{

if(success == true){

db.releaseReference();

}

}

return count;

}

@Override

public String getType(Uri uri)

{

switch(mUriMathcer.match(uri)){

case ALARM:

return AlarmInfo.CONTENT_TYPE;

default:

throw new IllegalArgumentException("Unknown URI " + uri);

}

}

@Override

public synchronized Uri insert(Uri uri, ContentValues initValues)

{

SQLiteDatabase mSQLiteDatabase = null;

boolean success = false;

try{

mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();

mSQLiteDatabase.acquireReference();

success = true;

long mRowId;

ContentValues values;

if(initValues == null){

values = new ContentValues();

}else{

values = initValues;

}

switch(mUriMathcer.match(uri)){

case ALARM:

mRowId = mSQLiteDatabase.insert(ALARM_TABLE_NAME,

AlarmInfo._ID, values);

if(mRowId > 0){

return uri;

}else{

throw new SQLException("Failed to insert to "+uri);

}

}

}catch(SQLException e){

e.printStackTrace();

}finally{

if(success == true)

mSQLiteDatabase.releaseReference();

}

return null;

}

@Override

public boolean onCreate()

{

// Log.i("alarm provider", "onCreate()...");

mDatabaseHelper = new DatabaseHelper(getContext());

return true;

}

@Override

public synchronized Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder)

{

SQLiteQueryBuilder mSQLiteQueryBuilder = new SQLiteQueryBuilder();

switch(mUriMathcer.match(uri)){

case ALARM:

mSQLiteQueryBuilder.setTables(ALARM_TABLE_NAME);

break;

}

SQLiteDatabase mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();

mSQLiteDatabase.acquireReference();

Cursor mCursor = mSQLiteQueryBuilder.query(mSQLiteDatabase, projection,

selection, selectionArgs, null, null, sortOrder);

mSQLiteDatabase.releaseReference();

return mCursor;

}

@Override

public synchronized int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs)

{

SQLiteDatabase mSQLiteDatabase = null;

int count = 0;

boolean success = false;

try{

mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();

mSQLiteDatabase.acquireReference();

success = true;

switch(mUriMathcer.match(uri)){

case ALARM:

count = mSQLiteDatabase.update(ALARM_TABLE_NAME, values,

selection, selectionArgs);

break;

default:

break;

}

}catch(SQLException e){

e.printStackTrace();

}finally{

if(success == true)

mSQLiteDatabase.releaseReference();

}

return count;

}

}

可以参考android alarm源码,query,update等方法写法基本不改什么,只替换表名。或增加一个case.

DBHelper类中的.ExecuteCommand和.GetScalar区别是...

其实你只需明白

GetScalar()方法只返回 第一行第一列

就知道区别了吧

ExecuteCommand,却返回所有你要查询的

比如 select top 10 * from userInfo

那么ExecuteCommand就返回了10行

而 GetScalar只返回了一行,而且是只有第一列的一行

安卓 DBhelper

我想使用DBhelper,数据库已经做好了,需要放在哪个文件夹,怎么使用,主要是构造函数怎么写?已经有了数据库,只需要使用,不需创建,该怎么办?就是说数据库是用外部程序创建的。...

我想使用DBhelper,数据库已经做好了,需要放在哪个文件夹,怎么使用,主要是构造函数怎么写?

已经有了数据库,只需要使用,不需创建,该怎么办?就是说数据库是用外部程序创建的。

一般就放在工程目录下的

大致的写法如下,都是大同小异的,就是一些需求可能有区别:

public class MyDBHelper extends SQLiteOpenHelper {

private static final int VERSION = 2;

public static final String DBName = "userinfos";

public static final String USER_TABLE_NAME = "users";

private String CREATE_TABLE = "create table if not exists "+USER_TABLE_NAME+"(personid integer primary key,name varchar(20),age integer)";

public MyDBHelper (Context context, String name, CursorFactory factory, int version) {

super(context, name, factory, VERSION);

}

/**

* 对外创建该类的时候就用这个方法,比较方便,因为数据库的版本号以及CursorFactory一般也不会改变。

* @param context

*/

public MyDBHelper(Context context) {

super(context, DBName, null, VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL( CREATE_TABLE);

}

}

在Android开发中 DatabaseHelper dbHelper = new D...

这个应该是数据库名字吧,DatabaseHelper这个类是被你又封闭过的,通常是继承SQLiteOpenHelper 类,重写一下以方便管理数据库。

实现继承 SQLiteOpenHelper 类的 dbHelper 类。

《移动应用开发》应用于安卓系统,如何实现继承SQLiteOpenHelper类的dbHelper类。要求:逻辑结构完整,答案要点突出,论述充分,每题答案字数不少于400字。...

《移动应用开发》应用于安卓系统,如何实现继承 SQLiteOpenHelper 类的 dbHelper 类。

要求:逻辑结构完整,答案要点突出,论述充分,每题答案字数不少于400字。

Android是有自带的类库的:SQLiteOpenHelper,使用的时候继承这个类,然后写逻辑就可以,一般使用单例模式: public synchronized static DBHelper getDBHelper(Context context) { if (helper == null) { helper = new DBHelper(context); } return helper; } private DBHelper(Context context) { super(context, "自己的数据库名", null, 数据库版本); } 使用的时候也很简单,下面是一个删除操作: public synchronized void deleteSite(String packname) { SQLiteDatabase db = getWritableDatabase(); try { db.beginTransaction(); db.delete("site", "packname=?", new String[] { packname }); db.setTransactionSuccessful(); } finally { db.endTransaction(); if (db != null) { } } }

C# 里面DBhelper helper = new DBHelper(); 是什么...

DBhelper这个通常是连接数据库的类,是自己定义的,意思就是你定义的时候想起什么名就什么名。DBhelper这个类里面有一个连接数据库方法,DBhelper helper = new DBHelper(); 是用来实例化一个类的对象,用这个对象helper来调用里面连接数据库的方法。

C#怎么使用DBHelper类连接数据库?

首先你得有DBHelpler这个类,然后你看这个类中你要进行调用的方法是不是静态的如果是静态的直接用类名.方法名即可,前提是引用这个类的命名空间,如果不是静态的话,那么就new一下这个类,然后用这个new的DBHelper的变量点出你要用的方法即可,如果你没有DBHelper的话,你可以去下载一个,或者找一个,或者自己写一个。

追问

复制过来的 我自己也能找到呀 就是没懂才问的啦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 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(); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值