2017-02-21 2 views
0

У меня есть приложение asp.net, в котором люди смогут вставлять английские, французские и японские данные в базу данных MS SQL. Я внесла необходимые изменения в БД, как имеющие поля как NVARCHAR, а также установил префикс «N» перед фактическим параметром (поскольку я использую хранимые процедуры).Сохранение японского текста в базу данных SQL

либо исправления, которые не работают, я мог бы делать что-то неправильно с префиксом, было бы замечательно, если вы можете помочь мне решить эту проблему :)

Параметры я использую ниже:

@RewardId INT = NULL, 
    @SupplierId INT = NULL, 
    @RewardCode NVARCHAR(50) = NULL, 
    @RewardDesc NVARCHAR(MAX) = NULL, 
    @RStartDate DATETIME = NULL, 
    @REndDate DATETIME = NULL, 
    @RStatus BIT = NULL, 
    @RCostPrice FLOAT = NULL, 
    @PDCost FLOAT = NULL, 
    @RStocks INT = NULL, 
    @RewardTypeId INT = NULL, 
    @RCategoryId INT = NULL, 
    @RProductDesc NVARCHAR(MAX) = NULL, 
    @RTermsCond NVARCHAR(MAX) = NULL, 
    @DMId INT = NULL, 
    @RRetailPrice FLOAT = NULL, 
    @TemplateId INT = NULL, 
    @RFreight FLOAT = NULL, 
    @RTotalCost FLOAT = NULL, 
    @MinimumQuantity INT = NULL, 
    @RewardImageURL nvarchar(500) = null, 
    @UpdateDate nvarchar(50) = null, 
    @Rpoints nvarchar(50) = null , 
    @ExpiryDateSetup nvarchar(50), 
    @ExpiryNumberOfMonths nvarchar(50), 
    @minimumstockcount int = NULL, 
    @RewardRelationId int = null, 
    @ParentRewardCode nvarchar(50) =null, 
    @EstimatedSaving nvarchar(50) = null, 
    @IsAirMilesMonday bit = False, 
@IsExpirymonthly bit = False, 
@IsPromoCodeEnabled nvarchar(50) = null, 
    @IsLocked nvarchar(50) = null, 
@IsCompetition nvarchar(50) = null, 
@Sorting nvarchar(50) = null, 
@Tier nvarchar(50) = null 

путь я коплю данные ниже:

UPDATE 
    Rewards 
SET 
    SupplierId = @SupplierId, 
    RewardCode = @RewardCode, 
    RewardDesc = 'N'[email protected], 
    RStartDate = @RStartDate, 
    REndDate = @REndDate, 
    RStatus = @RStatus, 
    RCostPrice = @RCostPrice, 
    RStocks = @RStocks, 
    RewardTypeId = @RewardTypeId, 
    RCategoryId = @RCategoryId, 
    RProductDesc = 'N'[email protected], 
    RTermsCond = 'N'[email protected], 
    RRetailPrice = @RRetailPrice, 
    PDCost = @PDCost, 
    RFreight = @RFreight, 
    TemplateId = @TemplateId, 
    RTotalCost = @RTotalCost, 
    DMId = @DMId, 
    MinimumQuantity = @MinimumQuantity, 
    RewardImageURL = @RewardImageURL, 
    UpdateDate = @UpdateDate, 
    Points = @Rpoints , 
    ExpiryDateSetup = @ExpiryDateSetup, 
      ExpiryNumberOfMonths = @ExpiryNumberOfMonths, 
      MinimumStockCount = @minimumstockcount, 
      RewardRelationId = @RewardRelationId , 
      ParentRewardCode = @ParentRewardCode , 
      EstimatedSaving = @EstimatedSaving, 
      IsAirMilesMonday = @IsAirMilesMonday , 
      IsExpirymonthly = @IsExpirymonthly, 
      IsPromoCodeEnabled = @IsPromoCodeEnabled, 
      Islocked = @IsLocked , 
      IsCompetition = @IsCompetition , 
      Sorting = @Sorting, 
      tier = @tier 
WHERE 
    RewardId = @RewardId; 

******** EDIT ***********

Кода, используемый для вызова SP определен ниже:

Public Function Save(ByVal us As String, ByRef obrewardsold As cls_Rewards, ByRef obrewardsnew As cls_Rewards) As Boolean 

    Dim sSQL As String 
    Dim rtn As Boolean 

    Dim rs As SqlDataReader = Nothing 

    Try 

     Save = True 

     sSQL = "exec Rewards_upd" 
     sSQL = sSQL & " @SupplierId=" & gFixQuotes(SupplierId) 

     sSQL = sSQL & ", @RewardId=" & gFixQuotes(RewardId) 
     sSQL = sSQL & " , @RewardCode=" & gFixQuotes(RewardCode) 
     sSQL = sSQL & ", @RewardDesc=" & gFixQuotes(RewardDesc) 
     sSQL = sSQL & ", @RStartDate=" & gFixQuotes(RStartDate) 
     sSQL = sSQL & ", @REndDate=" & gFixQuotes(REndDate) 
     sSQL = sSQL & ", @RStatus=" & gFixQuotes(RStatus) 
     sSQL = sSQL & ", @RCostPrice=" & gFixQuotes(RCostPrice) 
     sSQL = sSQL & ", @RRetailPrice=" & gFixQuotes(RRetailPrice) 
     sSQL = sSQL & " ,@RFreight=" & gFixQuotes(RFreight) 
     rtn = GetData(rs, sSQL) 
+0

Пожалуйста, прочтите следующее: http://dba.stackexchange.com/questions/90296/storing- japanese-characters-in-a-table – Lazcano

+2

Собственно, вы * разбиваете * данные - если параметры Unicode, то есть nvarchar, вам не нужно ничего делать. Строка 'RewardDesc = 'N' + @ RewardDesc, хотя и объединяет строку ASCII, содержащую' N', с строковым параметром, таким образом преобразуя все в ASCII –

+0

Вы можете использовать это как: ** N '' + @ RewardId + '' ** –

ответ

3

Ни ASP.NET, ни SQL Server не требуется никакие уловки, чтобы работать с Unicode. Оба поддерживают Unicode изначально. Во всех случаях, когда появляются странные символы, преобразование в ASCII было принудительно. Либо поле таблицы было varchar, либо тип параметра, либо запрос содержал строковые литералы ASCII.

Иногда может быть, что исходный файл был сохранен как ASCII, что привело к неожиданным преобразованиям даже до того, как был скомпилирован файл. Эта конкретная проблема исчезла, когда Visual Studio перешла на UTF8 по умолчанию. Я не помню, когда это произошло, возможно, это было десять лет назад, может быть, даже раньше. Он может появиться, если вы используете текстовый редактор, который по умолчанию не использует UTF8.

Чтобы сохранить японский язык, сделайте то же самое, что и с каждый другая строка Unicode - просто убедитесь, что вы используете типы Unicode.

Во-первых, убедитесь, что таблица использует nvarchar поля:

CREATE TABLE Rewards 
(
    RewardId int not null primary key, 
    RewardDesc nvarchar(50), 
    ... 
) 

и все сохраненные параметры процедуры, на самом деле nvarchar. После этого, единственное, что вам нужно сделать, это создать параметризованный запрос с SqlDbType.NVarChar параметрами:

var cmd=new SqlCommand("Rewards_upd",connection); 
cmd.CommandType = CommandType.StoredProcedure; 
... 
// Assuming that RewardId is an integer 
cmd.Parameters.Add("@RewardId ", SqlDbType.Int).Value = RewardId; 
// otherwise, parse it first. This will detect invalid input before executing the query 
// cmd.Parameters.Add("@RewardId ", SqlDbType.Int).Value = int.Parse(RewardId); 
cmd.Parameters.Add("@RewardDesc ", SqlDbType.NVarChar,50).Value = RewardDesc; 

var reader=cmd.ExecuteReader(); 

сама хранимая процедура не нужно ничего делать, чтобы поддерживать Unicode ввода, просто использовать правильные типы:

Конкатенация N с японской струной будет содержать бесполезный символ N. Например, следующий запрос возвращает:

declare @text nvarchar(50)=N'如抜範浪偃壅國' 

select @text, 'N' + @text 

------- 
如抜範浪偃壅國 N如抜範浪偃壅國 

SQL Server преобразует N в Unicode и предварять его @text.

С другой стороны, если был использован строковый литерал, результат будет искажено:

select '如抜範浪偃壅國' 
------- 
??????? 

Если вы видите знаки вопроса вместо текста на японском языке, наиболее вероятной причиной является то, что вы используете ASCII строк или литералов. Скорее всего, вы не используете параметризованные запросы для вызова хранимой процедуры и вместо этого создаете строку SQL с конкатенацией.

Смежные вопросы