C++ 调用SQLSERVER 数据库存储过程示例

C++ 调用SQLSERVER 数据库存储过程示例


1.数据库名为5C_DB,数据库登陆账户名:sa,密码为:duan00

2.存储过程名为“[dbo].[GetAllPicPath]”,

输入一个整数,CheckRecordID int,返回(五个图片路径+一个整数表示不同的情况)
内容如下:

(如果第一次创建存储过程[dbo].[GetAllPicPath] ,应该用
CREATE PROCEDURE [dbo].[GetAllPicPath] ,如果已经存在该存储过车,就用
ALTER PROCEDURE [dbo].[GetAllPicPath] 

USE [5C_DB]
GO
/****** Object:  StoredProcedure [dbo].[GetAllPicPath]    Script Date: 03/27/2017 13:54:12 

******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetAllPicPath] 
	-- Add the parameters for the stored procedure here
	@CheckRecordID int, --输入参数
	@strArc1Path nvarchar(255) out, --输出参数:受电弓1路径
	@strArc1ThumbnailPath nvarchar(255) out, ---输出参数:受电弓1缩略图路径
	@strArc2Path nvarchar(255) out, --输出参数:受电弓2路径
	@strArc2ThumbnailPath nvarchar(255) out, ---输出参数:受电弓2缩略图路径
	@strNumPath nvarchar(255) out, ---输出参数:号牌图片路径
	@returnID int out ---输出参数:返回类型
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	-- 我们平时查询的时候在消息栏里不是会有,(1行受影响)之类的文字吗,加上set nocount 

on后就不会有了,这就避免了这些没有的信息了
	SET NOCOUNT ON;

    -- Insert statements for procedure here
    --根据入参@CheckRecordID从CheckRecord表中获取图片基本路径 和 设备名
    --声明返回值@intReturn, 返回值说明如下
    --0,表示拍摄异常,包括未拍摄到弓 和 拍摄到大于2个弓
    --1,表示只拍摄到一个弓,并且1号弓为升弓
    --2,表示只拍摄到一个弓,并且2号弓为升弓
    --3,表示只拍摄到一个弓,并且1号弓为降弓
    --4,表示只拍摄到一个弓,并且2号弓为降弓
    --5,表示拍摄到了两个弓,并且都为升弓
    --6,表示拍摄到了两个弓,并且都为降弓
    --7,表示拍摄到了两个弓,且1号弓为升弓,2号弓为降弓
    --8,表示拍摄到了两个弓,且2号弓为升弓,1号弓为降弓
    DECLARE @intReturn int
    select @intReturn=0
    
    DECLARE @strPicPath nvarchar(Max)
    DECLARE @DeviceID nchar(10)
	SELECT @strPicPath=ImaAddr, @DeviceID=DeviceID FROM CheckRecord WHERE 

ChekID=@CheckRecordID
    --print '检索到:' + cast(@@rowcount as char) + '行'
	--print '中间基本录为:' + @strPicPath
	--print '设备ID为:' + @DeviceID

	--根据设备ID(DeviceID) 获取设备名
	DECLARE @strDeviceName nvarchar(10)
	select @strDeviceName=DeviceName from DeviceInfo where DeviceID=@DeviceID
	--print '检索到:' + cast(@@rowcount as char) + '行'
	--print '设备名为:' + @strDeviceName + '11'
    select @strDeviceName= RTRIM(@strDeviceName)
    --print '设备名为:' + @strDeviceName + '11'
	--根据checkRecordID 在ArcCheckRecord表中 获取行数
	DECLARE @ArcNum int
	DECLARE @ArcRiseCount int, @ArcDownCount int, @ArcRiseNum int,@ArcDownNum int
	set @ArcRiseCount=0
	set @ArcDownCount=0
	set @ArcRiseNum=0
	set @ArcDownNum=0
	DECLARE Arc_Cursor SCROLL CURSOR --创建游标
	for								 --并给游标赋值
	select ArcNo, ArcIsRise from ArcCheckRecord where checkrecordid=@CheckRecordID
	--print '检索到:' + cast(@@rowcount as char) + '行'
	set @ArcNum=@@rowcount
	
	OPEN Arc_Cursor --打开游标
	DECLARE @ArcNo int, @ArcIsRise int
	FETCH NEXT from Arc_Cursor INTO @ArcNo, @ArcIsRise	
	--检查check @@FETCH_STATUS变量.查看FETCH命令是否成功执行
	WHILE @@FETCH_STATUS = 0
	BEGIN
		if @ArcIsRise=1
		BEGIN
			select @ArcRiseCount = @ArcRiseCount + 1
			select @ArcRiseNum = @ArcNo
		END
		else
		BEGIN
			select @ArcDownCount = @ArcDownCount + 1
			set @ArcDownNum=@ArcNo
		END 	
		FETCH NEXT from Arc_Cursor INTO @ArcNo, @ArcIsRise				
	END
	--print '升弓数量:' + cast(@ArcRiseCount as char)
	--print '降弓数量:' + cast(@ArcDownCount as char)
	--print cast(@ArcRiseNum as char) + '号弓升弓'
	close Arc_Cursor --关闭游标
	DEALLOCATE Arc_Cursor --释放游标
	
	--
	select @ArcNum=@ArcRiseCount + @ArcDownCount
	if @ArcNum = 1 --如果只拍摄到一个弓
	begin
		if @ArcRiseNum=1 --如果只拍摄到一个弓,并且1号弓为升弓
		begin
		    print '只拍摄到一个弓,并且1号弓为升弓'
			select @strArc1Path = @strDeviceName + '\' + @strPicPath + 

'\1\0\PantographResult1.jpg' 
			print @strArc1Path
			select @strArc1ThumbnailPath = @strDeviceName + '\' + @strPicPath + 

'\1\0\PantographLessImg1.jpg'
		    print @strArc1ThumbnailPath
		    SELECT @strArc2Path = ''
		    print @strArc2Path
		    SELECT @strArc2ThumbnailPath = ''
		    print @strArc2ThumbnailPath	
		    select @intReturn=1
		end
		else --如果只拍摄到一个弓,并且2号弓为升弓
		begin
			if @ArcRiseNum=2
			begin
				print '只拍摄到一个弓,并且2号弓为升弓'
				select @strArc1Path = ''
				print @strArc1Path
				select @strArc1ThumbnailPath = ''
				print @strArc1ThumbnailPath
				SELECT @strArc2Path = @strDeviceName + '\' + @strPicPath + 

'\1\1\PantographResult1.jpg' 
				print @strArc2Path
				SELECT @strArc2ThumbnailPath =  @strDeviceName + '\' + 

@strPicPath + '\1\1\PantographLessImg1.jpg'
				print @strArc2ThumbnailPath
				select @intReturn=2	
		    end
		    else
		    begin
				if @ArcDownNum=1
				begin
					print '只拍摄到一个弓,并且1号弓为降弓'
					select @strArc1Path = @strDeviceName + '\' + 

@strPicPath + '\2\PantographResult1.jpg' 
					print @strArc1Path
					select @strArc1ThumbnailPath = @strDeviceName + '\' 

+ @strPicPath + '\2\PantographLessImg1.jpg'
					print @strArc1ThumbnailPath
					SELECT @strArc2Path = @strDeviceName + '\' + 

@strPicPath + '\1\1\PantographResult1.jpg' 
					print @strArc2Path
					SELECT @strArc2ThumbnailPath =  @strDeviceName + 

'\' + @strPicPath + '\1\1\PantographLessImg1.jpg'
					print @strArc2ThumbnailPath	
					select @intReturn=3
				end
				else
				begin
					print '只拍摄到一个弓,并且2号弓为降弓'
					select @strArc1Path = @strDeviceName + '\' + 

@strPicPath + '\1\0\PantographResult1.jpg' 
					print @strArc1Path
					select @strArc1ThumbnailPath = @strDeviceName + '\' 

+ @strPicPath + '\1\0\PantographLessImg1.jpg'
					print @strArc1ThumbnailPath
					SELECT @strArc2Path = @strDeviceName + '\' + 

@strPicPath + '\2\PantographResult2.jpg' 
					print @strArc2Path
					SELECT @strArc2ThumbnailPath =  @strDeviceName + 

'\' + @strPicPath + '\2\PantographLessImg2.jpg'
					print @strArc2ThumbnailPath				

	
					select @intReturn=4
				end
		    end
		end
	end
	ELSE --如果拍摄的不止一个弓
	BEGIN
		if @ArcNum = 2 --如果拍摄到两个弓
		BEGIN
			IF @ArcRiseCount = 2 --如果拍摄到两个弓,并且都为升弓
			BEGIN
			    print '拍摄到两个弓,并且都为升弓'
				select @strArc1Path = @strDeviceName + '\' + @strPicPath + 

'\1\0\PantographResult1.jpg' 
				print @strArc1Path
				select @strArc1ThumbnailPath = @strDeviceName + '\' + 

@strPicPath + '\1\0\PantographLessImg1.jpg'
				print @strArc1ThumbnailPath
				SELECT @strArc2Path = @strDeviceName + '\' + @strPicPath + 

'\1\1\PantographResult1.jpg' 
				print @strArc2Path
				SELECT @strArc2ThumbnailPath =  @strDeviceName + '\' + 

@strPicPath + '\1\1\PantographLessImg1.jpg'
				print @strArc2ThumbnailPath	
				select @intReturn=5
			END
			ELSE --如果拍摄到两个弓,并且不是都为升弓
			BEGIN
				IF @ArcDownCount = 2 --如果拍摄到两个弓,并且都为降弓
				BEGIN
				    print '拍摄到两个弓,并且都为降弓'
					select @strArc1Path = @strDeviceName + '\' + 

@strPicPath + '\2\PantographResult1.jpg' 
					print @strArc1Path
					select @strArc1ThumbnailPath = @strDeviceName + '\' 

+ @strPicPath + '\2\PantographLessImg1.jpg'
					print @strArc1ThumbnailPath
					SELECT @strArc2Path = @strDeviceName + '\' + 

@strPicPath + '\2\PantographResult2.jpg' 
					print @strArc2Path
					SELECT @strArc2ThumbnailPath =  @strDeviceName + 

'\' + @strPicPath + '\2\PantographLessImg2.jpg'
					print @strArc2ThumbnailPath	
					select @intReturn=6
				END
				ELSE --如果拍摄到两个弓,并且为一个降弓/一个升弓
				begin
					if @ArcRiseNum=1 --如果拍摄到两个弓,并且为1号弓升弓

,2号弓为降弓
					begin
					    print '拍摄到两个弓,并且为1号弓升弓,2号弓为降

弓'
						select @strArc1Path = @strDeviceName + '\' 

+ @strPicPath + '\1\0\PantographResult1.jpg' 
						print @strArc1Path
						select @strArc1ThumbnailPath = 

@strDeviceName + '\' + @strPicPath + '\1\0\PantographLessImg1.jpg'
						print @strArc1ThumbnailPath
						SELECT @strArc2Path = @strDeviceName + '\' 

+ @strPicPath + '\2\PantographResult2.jpg' 
						print @strArc2Path
						SELECT @strArc2ThumbnailPath =  

@strDeviceName + '\' + @strPicPath + '\2\PantographLessImg2.jpg'
						print @strArc2ThumbnailPath	
						select @intReturn=7				

	
					end
					else --如果拍摄到两个弓,并且为2号弓升弓,1号弓为降

弓
					begin
						print '拍摄到两个弓,并且为2号弓升弓,1号弓

为降弓'
						select @strArc1Path = @strDeviceName + '\' 

+ @strPicPath + '\1\1\PantographResult1.jpg' 
						print @strArc1Path
						select @strArc1ThumbnailPath = 

@strDeviceName + '\' + @strPicPath + '\1\1\PantographLessImg1.jpg'
						print @strArc1ThumbnailPath
						SELECT @strArc2Path = @strDeviceName + '\' 

+ @strPicPath + '\2\PantographResult1.jpg' 
						print @strArc2Path
						SELECT @strArc2ThumbnailPath =  

@strDeviceName + '\' + @strPicPath + '\2\PantographLessImg1.jpg'
						print @strArc2ThumbnailPath		
						select @intReturn=8				

		
					end
				end
			END
		END
		ELSE --如果拍摄到大于2个弓,判断其出现异常
		BEGIN
		    print '拍摄到大于2个弓,或没拍摄到弓,出现异常!!!!!'
			select @strArc1Path = ''
			print @strArc1Path
			select @strArc1ThumbnailPath = ''
			print @strArc1ThumbnailPath
			SELECT @strArc2Path = ''
			print @strArc2Path
			SELECT @strArc2ThumbnailPath =  ''
			print @strArc2ThumbnailPath	
			select @intReturn=0		
		END
	END
	select @strNumPath = @strDeviceName + '\' + @strPicPath + '\3\WagonResult.jpg' ---

输出参数:号牌图片路径
	select @returnID = @intReturn
	return @intReturn
END



3.调用存储过程代码
(备注代码中1433,表示SQLSERVER所在电脑要打开TCP/IP端口号,具体设置请按照http://www.2cto.com/database/201306/217563.html 所示(SQL server 2008 1433端口开启解决方案))
int iSize = strlen("Provider=SQLOLEDB; Server=127.0.0.1,1433;Database=5C_DB; uid=sa; pwd=duan00;");
其中server = 127.0.0.1,1433表示链接本机(127.0.0.1)1433端口;
Database=5C_DB,表示使用5C_DB这个数据库;
uid=sa; pwd=duan00;表示数据库登录名为sa,密码为duan00的用户

#include <stdio.h>

#include <string>
#include <iostream>

using namespace std;
#import "msado15.dll" \
	no_namespace \
	rename ("EOF", "adoEOF")

int main(void)
{
// 	@return_value = [dbo].[GetAllPicPath]
// 	@CheckRecordID = 127,
// 		@strArc1Path = @strArc1Path OUTPUT,
// 		@strArc1ThumbnailPath = @strArc1ThumbnailPath OUTPUT,
// 		@strArc2Path = @strArc2Path OUTPUT,
// 		@strArc2ThumbnailPath = @strArc2ThumbnailPath OUTPUT,
// 		@strNumPath = @strNumPath OUTPUT

	_CommandPtr mCommandPtr;
	_RecordsetPtr mRecordsetPtr;
	_ConnectionPtr mConnectionPtr;

	char sqlString[256] = {0};
	int iSize = strlen("Provider=SQLOLEDB; Server=127.0.0.1,1433;Database=5C_DB; uid=sa; pwd=duan00;");
	
	memcpy(sqlString,"Provider=SQLOLEDB; Server=127.0.0.1,1433;Database=5C_DB; uid=sa; pwd=duan00;",iSize);


	CoInitialize(NULL); //初始化COM组件
	try {
		mConnectionPtr.CreateInstance(__uuidof(Connection));// 创建Connection对象
	} catch (_com_error e) {
		CoUninitialize();
	}
	try {
		mConnectionPtr->Open(sqlString,"", "", adModeUnknown);
	} catch (_com_error e) {
		string errorInfo = e.Description();
		CoUninitialize();
	}
	CoUninitialize();	
	try
	{
		mCommandPtr.CreateInstance(__uuidof(Command));
		mCommandPtr->ActiveConnection=mConnectionPtr;     //绑定_ConnectionPtr
		mCommandPtr->CommandText=_bstr_t("GetAllPicPath"); //存储过程名
		mCommandPtr->CommandType=adCmdStoredProc;	//命令类型为存储过程或事务等

		//添加参数CheckRecordID
		_ParameterPtr pParam1;
		pParam1.CreateInstance(__uuidof(Parameter));
		pParam1=mCommandPtr->CreateParameter(_bstr_t("@CheckRecordID"),DataTypeEnum::adInteger,adParamInput,sizeof(int));
		pParam1->Value=_variant_t(1);
		mCommandPtr->Parameters->Append(pParam1);

		_ParameterPtr pParam2;
		pParam2.CreateInstance(__uuidof(Parameter));
		pParam2=mCommandPtr->CreateParameter(_bstr_t("@strArc1Path"),DataTypeEnum::adVarChar,adParamOutput,256);
		mCommandPtr->Parameters->Append(pParam2);

		_ParameterPtr pParam3;
		pParam3.CreateInstance(__uuidof(Parameter));
		pParam3=mCommandPtr->CreateParameter(_bstr_t("@strArc1ThumbnailPath"),DataTypeEnum::adVarChar,adParamOutput,256);
		mCommandPtr->Parameters->Append(pParam3);

		_ParameterPtr pParam4;
		pParam4.CreateInstance(__uuidof(Parameter));
		pParam4=mCommandPtr->CreateParameter(_bstr_t("@strArc2Path"),DataTypeEnum::adVarChar,adParamOutput,256);
		mCommandPtr->Parameters->Append(pParam4);

		_ParameterPtr pParam5;
		pParam5.CreateInstance(__uuidof(Parameter));
		pParam5=mCommandPtr->CreateParameter(_bstr_t("@strArc2ThumbnailPath"),DataTypeEnum::adVarChar,adParamOutput,256);
		mCommandPtr->Parameters->Append(pParam5);

		_ParameterPtr pParam6;
		pParam6.CreateInstance(TEXT("ADODB.Parameter"));
		pParam6=mCommandPtr->CreateParameter(TEXT("@strNumPath"), DataTypeEnum::adVarChar,adParamOutput,256);
		mCommandPtr->Parameters->Append(pParam6);

// 		//绑定返回值参数
		_ParameterPtr pParam7;
		pParam7.CreateInstance(__uuidof(Parameter));
		pParam7=mCommandPtr->CreateParameter(_bstr_t("@returnID"), DataTypeEnum::adInteger, adParamOutput,sizeof(int));
		mCommandPtr->Parameters->Append( pParam7);

		BOOL bInsert=FALSE;
		VARIANT vRecordsAffected;  //设置执行影响数据库表中的行数
		vRecordsAffected.vt=VT_I4;
		vRecordsAffected.lVal=0;
		//运行存储过程,返回结果集, 并在参数vRecordsAffected 中 返回存储过程运行的返回值

		mRecordsetPtr = mCommandPtr->Execute(&vRecordsAffected,NULL,adCmdStoredProc);

		string strArc1Path((LPSTR)(LPCSTR)_bstr_t(pParam2->Value));		
		cout << strArc1Path << endl;
		
		string strArc1ThumbnailPath((LPSTR)(LPCSTR)_bstr_t(pParam3->Value));
		cout <<strArc1ThumbnailPath << endl;
		
		string strArc2Path((LPSTR)(LPCSTR)_bstr_t(pParam4->Value));
		cout <<strArc2Path << endl;
		
		string strArc2ThumbnailPath((LPSTR)(LPCSTR)_bstr_t(pParam5->Value));
		cout <<strArc2ThumbnailPath << endl;
		
		string strNumPath((LPSTR)(LPCSTR)_bstr_t(pParam6->Value));
		cout <<strNumPath << endl;

		cout << (int)pParam7->Value<< endl;

	}
	catch (_com_error e)
	{
		string errorInfo = e.Description();
		cout << e.Description() << endl;
	    cout << e.ErrorMessage() << endl;
		CoUninitialize();
	}

	mCommandPtr.Release();
	mRecordsetPtr->Release();
	mConnectionPtr->Close();
	mConnectionPtr.Release();	
	CoUninitialize();
	system("pause");
	return 1;
}












  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c#是一种面向对象的编程语言,可以通过它来操作SQL Server数据库进行查询。 首先,我们需要使用C#中的System.Data.SqlClient命名空间来连接和操作SQL Server数据库。我们可以使用SqlConnection类来打开连接,并且传入数据库连接字符串作为参数。 接下来,我们可以使用SqlCommand类来执行SQL查询语句。可以使用ExecuteReader方法来执行SELECT语句,并返回一个SqlDataReader对象,该对象包含查询结果。我们可以通过调用SqlDataReader的Read方法来读取每一行的数据,并使用相应的索引或列名来获取特定列的值。 例如,我们可以使用以下代码来查询一个名为"Students"的表,并输出所有学生的姓名: ``` using System; using System.Data.SqlClient; class Program { static void Main() { string connectionString = "Data Source=server_name;Initial Catalog=database_name;User ID=user_id;Password=password"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string query = "SELECT Name FROM Students"; using (SqlCommand command = new SqlCommand(query, connection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string name = reader.GetString(0); Console.WriteLine(name); } } } } } } ``` 在上面的代码中,我们首先定义了一个连接字符串,它包含连接到SQL Server数据库所需的信息。然后我们使用using语句创建一个SqlConnection对象,并传入连接字符串来打开连接。 接下来,我们定义了一个查询语句,该语句选择了Students表中的所有姓名列。然后我们使用using语句创建一个SqlCommand对象,并传入查询语句和SqlConnection对象。最后我们使用ExecuteReader方法执行查询,并使用SqlDataReader的GetString方法来获取姓名列的值。然后我们使用Console.WriteLine方法将其输出。 注意在连接数据库时,需要替换连接字符串中的server_name、database_name、user_id和password为相应的信息。 以上就是使用C#进行SQL Server数据库查询的简单示例。当然,还有更多的方法和技巧可以进行数据库查询,这只是一个简单的入门指南。 ### 回答2: c sql server数据库查询是一种用于从SQL Server数据库中获取数据的操作。它通过编写SQL查询语句来实现这一目标。查询可以用于检索数据、过滤数据、排序数据以及汇总数据等。 一般而言,一个SQL查询包括以下几个部分:选择(select)、条件(where)、排序(order by)和限制(limit)。选择部分定义了要检索的列,条件部分过滤了要检索的行,排序部分定义了检索结果的排序方式,而限制部分则限制了检索结果的数量。 SQL查询可以根据特定的条件来过滤数据。例如,我们可以使用WHERE子句来指定一些特定的条件,比如只检索年龄大于18的学生,或者只检索姓名以'A'开头的员工等等。 排序在查询中也非常重要,它可以让我们按照指定的列对结果进行升序或降序的排列。例如,我们可以使用ORDER BY子句按照员工的工资从高到低对员工进行排序。 限制部分用于限制检索结果的数量。我们可以使用LIMIT关键字来设定需要返回的记录数,通过这个方式可以避免一次检索返回过多的数据,提高查询性能。 除了基本的查询操作,SQL还提供了许多高级的查询功能,如连接(join)、分组(group by)、统计函数和子查询等等。这些功能可以帮助我们更加灵活和高效地处理复杂的数据查询需求。 总之,c sql server数据库查询是一种利用SQL语言对SQL Server数据库进行检索、过滤、排序等操作的技术。它为我们提供了便利的方式来从数据库中获取需要的数据,并且可以根据具体需求进行灵活的查询设计。 ### 回答3: SQL Server是一种关系型数据库管理系统,用于存储、管理和查询数据。它提供了一种称为结构化查询语言(SQL)的编程语言,允许用户执行各种操作,包括创建表、插入、删除和更新数据以及查询数据。 在SQL Server中,查询是指在数据库中检索所需的数据。用户可以使用SELECT语句来执行查询操作。SELECT语句由一系列关键字和表达式组成,用于指定要返回的数据列、表、条件和排序方式。 SQL Server的查询语句可以使用WHERE子句来限制返回的数据行。WHERE子句使用用于比较的运算符,例如等于(=)、不等于(<>)、大于(>)、小于(<)等。可以使用AND和OR运算符来组合多个条件。WHERE子句还可以与通配符(如LIKE)一起使用,以便模糊搜索数据。 此外,SQL Server还提供了其他用于查询的关键字和函数。例如,GROUP BY子句用于将结果按指定的列进行分组,并使用聚合函数(如SUM、AVG、MAX和MIN)计算每个组的汇总值。HAVING子句通常与GROUP BY一起使用,用于筛选分组后的结果。 在查询中,还可以使用ORDER BY子句对返回的数据进行排序。可以指定要按升序(ASC)或降序(DESC)排序的列。ORDER BY子句通常在SELECT语句的末尾使用。 综上所述,SQL Server数据库查询是指使用SQL语句在数据库中检索所需数据的过程。通过使用SELECT、WHERE、GROUP BY、HAVING和ORDER BY等关键字和函数,用户可以根据特定条件检索数据、进行分组和聚合,并按照指定的排序方式返回结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值