BUG: ข้อผิดพลาด 22018 "อักขระที่ไม่ถูกต้องค่าสำหรับข้อมูลจำเพาะเพี้ยน" กับ SQL Server 6.5

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 269011 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อมี API ODBC ฟังก์ชันเช่นSQLExecuteเรียกกระบวนงานที่เก็บไว้ที่มีการเรียกsp_getbindtokenหรือที่ fires ทริกเกอร์ที่มีการเรียกsp_getbindtokenคุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้:
DIAG [22018] [Microsoft] [SQL ODBC เซิร์ฟเวอร์โปรแกรมควบคุม] ค่าอักขระไม่ถูกต้องสำหรับข้อมูลจำเพาะเกี่ยวกับเพี้ยน (0)
SQLExecuteส่งกลับค่า SQL_SUCCESS_WITH_INFO แต่รายงานข้อผิดพลาดด้านบน

การหลีกเลี่ยงปัญหา

เอาการเรียกไปsp_getbindtokenระบบวิธีการจัดเก็บไว้ หรือกำจัดพารามิเตอร์ขาออก

สถานะ

Microsoft ได้รับการยืนยันนี้จะมีปัญหาใน SQL Server 6.5

ข้อผิดพลาดนี้ไม่ได้เกิดขึ้นกับ SQL Server 7.0 หรือ SQL Server 2000

ข้อมูลเพิ่มเติม

ข้อผิดพลาดนี้เกิดขึ้นกับ 6.5 ในเซิร์ฟเวอร์ SQL การรวมทั้งบริการวิสแพ็ค 1 ถึง 5a เท่านั้น ข้อผิดพลาดนี้ไม่ได้เกิดขึ้นเมื่อมีเรียกกระบวนงานที่เก็บไว้จากisqlหรือยังไม่มีพารามิเตอร์ขาออก

เมื่อเรียกจากโปรแกรมประยุกต์ ODBC การดำเนินการตามขั้นตอนที่เก็บไว้ส่งกลับค่าที่ส่งคืนสินค้าที่บ่งชี้ความสำเร็จ แต่สร้างข้อผิดพลาดนี้ และไม่ส่งกลับพารามิเตอร์ขาออก การเรียก API ของ ODBCSQLExecuteส่งกลับค่า SQL_SUCCESS_WITH_INFO และข้อความแสดงข้อผิดพลาดด้านบน

ขั้นตอนในการทบทวนเกิดลักษณะการทำงาน

  1. สร้างตาราง กระบวนงานที่เก็บไว้ และทริกเกอร์คำใน Pubs ฐานข้อมูลโดยใช้สคริปต์ SQL ต่อไปนี้:
    create table emp_table (emp_id int primary key,
                            emp_name varchar(80) not null )
    go
    
    create trigger TR_emp_table_ins on emp_table
    for insert as
    begin
        declare @token_value varchar(255)
        exec master..sp_getbindtoken @token_value output
    end
    go
    
    create procedure test_proc_one
        @return_code int output,
        @error_code int output
    as
    begin
        declare @token_value varchar(255)
        declare @max_emp_id int
    
        select @return_code = 13
        begin tran
        select @max_emp_id = max(emp_id) from emp_table
    
        if @max_emp_id is null
        begin
            select @max_emp_id = 1
        end
        else
        begin
            select @max_emp_id = @max_emp_id + 1
        end
    
        insert into emp_table values(@max_emp_id, 'John Doe')
    
        if @@error <> 0
        begin
            raiserror('Insert into employee_list failed for emp_id %d', 16, -1, @max_emp_id)
            rollback tran
            select @return_code = -100
            select @error_code = -200
        end
        else
        begin
            commit tran
            select @return_code = 0
            select @error_code = 2
        end
    
    end /* procedure test_proc_one */ 
    go
    					
  2. เรียกใช้สคริปต์ SQL ต่อไปนี้ภายในisql. คุณควรเสร็จเรียบร้อยแล้ว และแทรกแถวลงในตารางการทดสอบ emp_table:
    declare @ret_value int
    declare @err_code int
    declare @string varchar(255)
    
    select @ret_value = 10
    select @err_code = 20
    
    exec test_proc_one @ret_value output, @err_code output
    
    select @string = 'test_proc_one set ret_value to ' + rtrim(convert(varchar(16), @ret_value))
                     + ' and err_code to ' + rtrim(convert(varchar(16), @err_code))
    
    print @string
    
    select * from emp_table
    					
  3. เรียกกระบวนงานที่เก็บไว้เดียวกันจากโปรแกรมประยุกต์ ODBC โดยใช้ตัวอย่างรหัสต่อไปนี้ ข้อผิดพลาดที่เหมือนกันสามารถยังสามารถ reproduced โดยใช้เครื่องมือทดสอบ ODBC โดยการเรียกฟังก์ชันที่แสดงในลำดับเดียวกัน
    	SQLRETURN rc;
    	SQLCHAR*  SQLStr = "{call test_proc_one(?,?)}";
       	SQLINTEGER nReturnCode = SQL_NTS;
    	SQLINTEGER nErrorCode = SQL_NTS;
    	SQLINTEGER cbReturnCode = SQL_NTS;
    	SQLINTEGER cbErrorCode = SQL_NTS;
    
    	/* Prepare the statement, bind parameters, and execute the statement */ 
    	rc = SQLPrepare(hStmt, SQLStr, SQL_NTS);
    	rc = SQLBindParameter(hStmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 
    		                    0, 0, &nReturnCode, 0, &cbReturnCode);
    	rc = SQLBindParameter(hStmt, 2, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER,
    		                    0, 0, &nErrorCode, 0, &cbErrorCode);
    	rc = SQLExecute(hStmt);
    
    	do {
    	   rc = SQLMoreResults(hStmt);
    	} while (rc != SQL_NO_DATA);
    					
  4. ผลลัพธ์ขั้นตอนข้างต้นในสถานะ SQL 22018 และข้อความ "ค่าอักขระไม่ถูกต้องสำหรับข้อมูลจำเพาะเพี้ยน" ด้วยรหัสของ SQL_SUCCESS_WITH_INFO ส่งคืนสินค้า ต่อไปนี้ถูกล็อกการสืบค้นกลับ ODBC ในตัวอย่าง:
    mssamp          163:166	EXIT  SQLExecute  with return code 1 (SQL_SUCCESS_WITH_INFO)
    		HSTMT               0x00cc2158
    
    		DIAG [22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) 
    					

คุณสมบัติ

หมายเลขบทความ (Article ID): 269011 - รีวิวครั้งสุดท้าย: 8 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Keywords: 
kbbug kbdatabase kbpending kbmt KB269011 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:269011

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com