Access kết nối SQL bị lỗi Tiếng Việt

Liên hệ QC

cuongtokyo0240

Thành viên mới
Tham gia
21/5/18
Bài viết
37
Được thích
4
Hiện tại em đang viết 1 cái stored procedure(gọi tắt là SP)cho cái Listbox lấy dữ liệu từ bảng Nhân Viên .
Ở mục Tìm kiếm nhân viên có 2 Textbox "Mã Nhân Viên + Tên Nhân Viên"
Ở Texbox "Tên Nhân Viên"
1) Nhập Tên nhân viên có dấu thì nó k trả kết quả -> lý do : trong SP thì ko nhận biết dc điều kiện Tiếng Việt
2) Nhập Tên nhân viên dạng ko có dấu thì kết quả vẫn bt .

※Trong bảng Nhân Viên thì cột tên nhân viên - khai báo kiểu dữ liệu [ Nvarchar(30) ]
Vậy có anh chị nào biết cách sửa lỗi này không thì chỉ em với ạ.?
Em cảm ơn .
 

File đính kèm

  • Demo.PNG
    Demo.PNG
    18.1 KB · Đọc: 20
Hiện tại em đang viết 1 cái stored procedure(gọi tắt là SP)cho cái Listbox lấy dữ liệu từ bảng Nhân Viên .
Ở mục Tìm kiếm nhân viên có 2 Textbox "Mã Nhân Viên + Tên Nhân Viên"
Ở Texbox "Tên Nhân Viên"
1) Nhập Tên nhân viên có dấu thì nó k trả kết quả -> lý do : trong SP thì ko nhận biết dc điều kiện Tiếng Việt
2) Nhập Tên nhân viên dạng ko có dấu thì kết quả vẫn bt .

※Trong bảng Nhân Viên thì cột tên nhân viên - khai báo kiểu dữ liệu [ Nvarchar(30) ]
Vậy có anh chị nào biết cách sửa lỗi này không thì chỉ em với ạ.?
Em cảm ơn .
Cái SP của bạn như thế nào?.
 
SP của em đay ạ, có lẽ nó thiếu chữ N dạng where N'tiếng việt'
ALTER PROCEDURE [dbo].[LIST_NhanVien]
(
@TK_MaNV nVARCHAR(20),
@TK_TenNV nVARCHAR(100)
)
AS

DECLARE
@abc VARCHAR(1000)

SET @abc = ''

IF @TK_MaNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' AND '
END
SET @abc = @abc + ' ( DBnhanvien.MaNV LIKE ''%' + @TK_MaNV + '%'')'
END

IF @TK_TenNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' OR '
END
SET @abc = @abc + ' ( DBnhanvien.TenNV LIKE ''%' + @TK_TenNV + '%'')'
END
IF @abc <> ''
BEGIN
SET @abc = ' WHERE ' + @abc
END

EXEC('
SELECT MaNV,TenNV,DiaChi
FROM DBnhanvien
' + @abc + '
ORDER BY MaNV

')
Bài đã được tự động gộp:

có thể sai ở cái from Dbnhan vien where + @abc kia
 
SP của em đay ạ, có lẽ nó thiếu chữ N dạng where N'tiếng việt'
ALTER PROCEDURE [dbo].[LIST_NhanVien]
(
@TK_MaNV nVARCHAR(20),
@TK_TenNV nVARCHAR(100)
)
AS

DECLARE
@abc VARCHAR(1000)

SET @abc = ''

IF @TK_MaNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' AND '
END
SET @abc = @abc + ' ( DBnhanvien.MaNV LIKE ''%' + @TK_MaNV + '%'')'
END

IF @TK_TenNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' OR '
END
SET @abc = @abc + ' ( DBnhanvien.TenNV LIKE ''%' + @TK_TenNV + '%'')'
END
IF @abc <> ''
BEGIN
SET @abc = ' WHERE ' + @abc
END

EXEC('
SELECT MaNV,TenNV,DiaChi
FROM DBnhanvien
' + @abc + '
ORDER BY MaNV

')
Bài đã được tự động gộp:

có thể sai ở cái from Dbnhan vien where + @abc kia
sao procedure của bạn dai dòng thế nhỉ

tạo sao không là:

select ...
from ....
where tennv like '%' + @tennv + '%' and manv like '%' + @manv + '%'
 
Access thì mình không rõ chỉ hóng thôi nhưng để debug bạn có thể gán câu lệnh SQL vào biến ngay trước khi dùng lệnh EXEC để xem câu lệnh này đúng chưa đã, bạn copy chuỗi đó ra chạy thử ở ngoài xem.
 
chắc thế, đọc mà thấy khó hiểu quá nên cứ theo #1 suy đại ra thôi

Mới có tí xíu mà đã khó hiểu, buồn vậy :(
Người ta có ý tưởng là tìm kiếm theo 1 trong 2 tiêu chí, hoặc mã hoặc tên
Nếu có truyền mã thì tìm theo mã, truyền tên thì tìm theo tên, không phải là

Mã:
where tennv like '%' + @tennv + '%' and manv like '%' + @manv + '%'

đâu nhá bạn. Cái sai ở đây chỉ là tác giả bị thiếu chữ N trong các truy vấn LIKE thôi.
Thí dụ
Mã:
DBnhanvien.TenNV LIKE ''%' + @TK_TenNV
nên đổi thành
Mã:
DBnhanvien.TenNV LIKE N''%' + @TK_TenNV

Ngoài ra thì cũng có thể sử dụng truy vấn SQL cứng luôn, không cần viết mã động nếu bảng không quá lớn :D
 
Mới có tí xíu mà đã khó hiểu, buồn vậy :(
Người ta có ý tưởng là tìm kiếm theo 1 trong 2 tiêu chí, hoặc mã hoặc tên
Nếu có truyền mã thì tìm theo mã, truyền tên thì tìm theo tên, không phải là

Mã:
where tennv like '%' + @tennv + '%' and manv like '%' + @manv + '%'

đâu nhá bạn. Cái sai ở đây chỉ là tác giả bị thiếu chữ N trong các truy vấn LIKE thôi.
Thí dụ
Mã:
DBnhanvien.TenNV LIKE ''%' + @TK_TenNV
nên đổi thành
Mã:
DBnhanvien.TenNV LIKE N''%' + @TK_TenNV

Ngoài ra thì cũng có thể sử dụng truy vấn SQL cứng luôn, không cần viết mã động nếu bảng không quá lớn :D
Vấn đề N' thì mình nghĩ không đúng, vì ở đây mình truyền tham số

Như mình đã nói là dựa vào #1 mình mới viết ra cái dòng đó, chẳng cần phải dài dòng văn tự làm gì cả.
Cái này nhờ chủ topic kiểm chứng

Cái sai của chủ topic là @abc khai báo là varchar, đúng phải là nvarchar
Bài đã được tự động gộp:

SP của em đay ạ, có lẽ nó thiếu chữ N dạng where N'tiếng việt'
ALTER PROCEDURE [dbo].[LIST_NhanVien]
(
@TK_MaNV nVARCHAR(20),
@TK_TenNV nVARCHAR(100)
)
AS

DECLARE
@abc VARCHAR(1000)

SET @abc = ''

IF @TK_MaNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' AND '
END
SET @abc = @abc + ' ( DBnhanvien.MaNV LIKE ''%' + @TK_MaNV + '%'')'
END

IF @TK_TenNV IS NOT NULL
BEGIN
IF @abc <> ''
BEGIN
SET @abc = @abc + ' OR '
END
SET @abc = @abc + ' ( DBnhanvien.TenNV LIKE ''%' + @TK_TenNV + '%'')'
END
IF @abc <> ''
BEGIN
SET @abc = ' WHERE ' + @abc
END

EXEC('
SELECT MaNV,TenNV,DiaChi
FROM DBnhanvien
' + @abc + '
ORDER BY MaNV

')
Bài đã được tự động gộp:

có thể sai ở cái from Dbnhan vien where + @abc kia
Bạn thay
DECLARE
@abc VARCHAR(1000)

bằng

DECLARE
@abc NVARCHAR(1000)

Và bạn có thể check giúp mình với dòng script mình đề xuất bạn xem chạy có ổn không, chứ thấy của bạn dài dòng quá
 
Lần chỉnh sửa cuối:
Mới đầu trong cái list tìm kiếm này em định thêm 1 vài điều kiện tìm kiếm nữa như Ngày vào cty, ngày Nghỉ việc , tìm kiếm theo khoảng thời gian nhân viên làm việc nữa nên viết như vậy. Nhưng sau đó em giảm điều kiện tìm kiếm xuống lên xóa bớt đi
 
Mới đầu trong cái list tìm kiếm này em định thêm 1 vài điều kiện tìm kiếm nữa như Ngày vào cty, ngày Nghỉ việc , tìm kiếm theo khoảng thời gian nhân viên làm việc nữa nên viết như vậy. Nhưng sau đó em giảm điều kiện tìm kiếm xuống lên xóa bớt đi
Bạn đã kiểm tra chưa? kết quả thế nào?
 
À, em thiếu chữ N ở cái like đó anh , em sửa rồi ạ. em cảm ơn các anh ạ
 
Vấn đề N' thì mình nghĩ không đúng, vì ở đây mình truyền tham số

Bạn có biết tại sao bạn không cần dùng chữ N vẫn ra kết quả, còn thớt tôi bảo nhất định phải có chữ N mới được không ? Cứ bình tĩnh suy nghĩ nhé, anh em cùng nhau học hỏi. :D
 
Theo đúng quy tắc là nó fai dạng select * from DB where N''
①Tham số truyền vào fai là dạng Nvarchar tiếng việt
②Điều kiện của nó buộc fai có chữ N trước ''
①và② là điều kiện cần và đủ .
Cảm ơn anh AutoReply đã gợi ý :)
Bài đã được tự động gộp:

Bạn có biết tại sao bạn không cần dùng chữ N vẫn ra kết quả, còn thớt tôi bảo nhất định phải có chữ N mới được không ? Cứ bình tĩnh suy nghĩ nhé, anh em cùng nhau học hỏi. :D

Giải sử anh truyền dữ liệu A = Tiếng Việt
Khi đó anh truyền tham số A đó vào-> nhưng trong SQL có where đó lại ko nhận biết đc A đó là tiếng việt hay alphabet (abcdexyz)
Vì vậy nếu chỉ truyền kiểu dữ liệu Nvarchar vào thì ko đủ. Nó chỉ là điều kiện Cần thôi ạ
 
Lần chỉnh sửa cuối:
Bạn có biết tại sao bạn không cần dùng chữ N vẫn ra kết quả, còn thớt tôi bảo nhất định phải có chữ N mới được không ? Cứ bình tĩnh suy nghĩ nhé, anh em cùng nhau học hỏi. :D
Cái này là chủ thớt dùng truy vấn động (excute) còn của mình thì khồng, mình không để ý kỹ cái truy vấn của chủ thớt, và mình cũng chẳng quan tâm, miễn làm sao đáp ứng #1 là được
Bài đã được tự động gộp:

Giải sử anh truyền dữ liệu A = Tiếng Việt
Khi đó anh truyền tham số A đó vào-> nhưng trong SQL có where đó lại ko nhận biết đc A đó là tiếng việt hay alphabet (abcdexyz)
Vì vậy nếu chỉ truyền kiểu dữ liệu Nvarchar vào thì ko đủ. Nó chỉ là điều kiện Cần thôi ạ
Bạn đã thử với cái truy vấn mình đề xuất chưa? khi đó bạn sẽ thấy câu trả lời của bạn thế nào.
 
Cái này là chủ thớt dùng truy vấn động (excute) còn của mình thì khồng, mình không để ý kỹ cái truy vấn của chủ thớt, và mình cũng chẳng quan tâm, miễn làm sao đáp ứng #1 là được
Bài đã được tự động gộp:


Bạn đã thử với cái truy vấn mình đề xuất chưa? khi đó bạn sẽ thấy câu trả lời của bạn thế nào.
Về bản chất cach cua ban nó vấn là 1.
Tại sao minh lại làm vậy vì sau nay khi nâng cấp thêm các tìm kiếm nó sẽ dễ cho việc chỉnh sửa , join nhiều bảng vvv với nhau .
 
Web KT
Back
Top Bottom