2011-12-16 25 views
7

Làm cách nào để sử dụng CAST trong ADO để chuyển đổi giá trị Float thành chuỗi?Loại ADO SQL truyền Float thành chuỗi (Excel)

tôi đã cố gắng

SELECT CAST([Field] AS VARCHAR(20)) FROM ... 

SELECT CAST([Field] AS STRING) FROM ... 

và luôn luôn có được một ngoại lệ OLE (Lỗi không xác định).

Cột bảng chứa các giá trị số hỗn hợp (đúng hợp lý) và chữ số (trái hợp lý). Nếu chỉ có giá trị chữ và số, kiểu trường truy vấn ADO là Chuỗi.

Tôi đang sử dụng Delphi 2009 ADO và Excel 2010.

Trả lời

2

Có lẽ sử dụng CStr sẽ làm việc, tức là

SELECT CStr([Field]) FROM... 
+0

Các CSTR có vẻ là một chức năng chuyển đổi hợp lệ. Bây giờ nó đưa ra một lỗi khác: Trường "Trường" không tìm thấy. Tôi đoán chức năng CSTR thay đổi tên cột và. Vì vậy, một tên trường bí danh là cần thiết: SELECT CStr ([Field]) là [Field]. Google có trợ giúp không :) – mjn

+0

Ngay cả sau khi truyền, vẫn còn lỗi khi mở tập kết quả - "E_FAIL". Không có thông tin nào khác được cung cấp. Tôi rất thích Excel như một định dạng trao đổi dữ liệu: P – mjn

+0

Có lẽ CSTR không thành công nếu trường đã là một chuỗi? Cố gắng chỉ cast những hàng không có giá trị kiểu string trong trường, giống như 'SELECT iif (fieldType ([field]) <> string, CStr ([field]), [field]) FROM'. Tôi không biết cú pháp đúng trên đỉnh đầu của tôi nhưng bạn có ý tưởng ... – ain

4

CAST là biểu thức SQL-Server. sử dụng SELECT Field FROM...

trong delphi: ADOQuery.FieldByName('Field').AsString

bạn không thể bỏ nó thông qua câu lệnh SQL.

khi sử dụng kiểu dữ liệu hỗn hợp:

đọc this from MSDN (Một Thận trọng về hỗn hợp các loại dữ liệu):

ADO must guess at the data type for each column in your Excel worksheet or range. (This is not affected by Excel cell formatting settings.) A serious problem can arise if you have numeric values mixed with text values in the same column. Both the Jet and the ODBC Provider return the data of the majority type, but return NULL (empty) values for the minority data type. If the two types are equally mixed in the column, the provider chooses numeric over text.

bạn sẽ cần phải thêm IMEX=1 trong phần Thuộc tính mở rộng của chuỗi kết nối. trường liên tục sẽ là TWideStringField.

Chuỗi kết nối nên tìm một cái gì đó như thế này:

Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=C:\MyFile.xls;Mode=Share Deny None;Extended Properties="Excel 8.0;IMEX=1";...

+0

Ứng dụng Delphi sử dụng Trường liên tục, do đó, lỗi xảy ra khi mở tập kết quả - điều này có nghĩa là tôi không thể sử dụng .AsString vì Mở đã thất bại – mjn

+0

nó không thành công ngay cả khi bạn sử dụng một lựa chọn đơn giản? tức là: "chọn * từ $ sheet1" (không cần truyền)?và bạn có ý nghĩa gì bởi "Trường liên tục"? – kobik

+0

"Trường liên tục" giống như các thành phần, lưu trữ các thuộc tính như loại, kích thước, độ chính xác, chú thích, v.v ... cho mỗi cột trong bảng. Một lựa chọn đơn giản * sẽ hoạt động. Nhưng nếu có những yêu cầu đặc biệt, các thành phần trường này ở đó và nếu chúng có loại không khớp với kiểu dữ liệu thực, thì thành phần Delphi ADO sẽ phàn nàn và làm tăng một ngoại lệ. – mjn

1

Hãy thử

SELECT IIF([Field] IS NULL, NULL, CSTR([Field])) AS [Field] 
    FROM ... 
Các vấn đề liên quan