BUG: Σφάλμα 22018 "χαρακτήρα δεν είναι έγκυρη τιμή για" με τον SQL Server 6.5

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 269011 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν λειτουργεί όπως ένα API του ODBCSQLExecuteκαλεί μια αποθηκευμένη διαδικασία που έχει μια κλήσηsp_getbindtokenή που fires εναύσματος που έχει μια κλήσηsp_getbindtokenΕνδέχεται να εμφανιστεί το ακόλουθο μήνυμα λάθους:
[22018] [Microsoft] [ODBC SQL Server Driver] DIAG χαρακτήρα δεν είναι έγκυρη τιμή για (0)
SQLExecuteΕπιστρέφει SQL_SUCCESS_WITH_INFO, αλλά αναφέρει το παραπάνω σφάλμα.

Εναλλακτικός τρόπος αντιμετώπισης

Καταργήστε την κλήση τουsp_getbindtokenσύστημα αποθηκευμένης διαδικασίας ή αφαιρέστε τις παραμέτρους εξόδου.

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι είναι ένα ζήτημα στον SQL Server 6.5.

Αυτό το σφάλμα δεν παρουσιάζεται με τον SQL Server 7.0 ή SQL Server 2000.

Περισσότερες πληροφορίες

Αυτό το σφάλμα προκύπτει μόνο με SQL Server 6.5, συμπεριλαμβανομένου του Service Pack 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 χρησιμοποιώντας το ακόλουθο δείγμα κώδικα. Επίσης μπορεί να αναπαραχθεί το ίδιο σφάλμα χρησιμοποιώντας το εργαλείο ελέγχου 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) 
    					

Ιδιότητες

Αναγν. άρθρου: 269011 - Τελευταία αναθεώρηση: Κυριακή, 19 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.5
Λέξεις-κλειδιά: 
kbbug kbdatabase kbpending kbmt KB269011 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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