by Anonymous » 01 Jan 2025, 20:44
Ich erstelle eine Angular- und C#-.NET-App. Ich habe ein Problem mit nicht-englischen Zeichen, die in meiner Datenbank gespeichert sind.
Das ist mein Code:
Code: Select all
public async Task CreateRegCaseCustomerDocumentAsync(string title, string description, string fileName, string contentType, byte[] content, Guid regCaseSourceId, Guid customerDocumentTypeSourceId, int? taskId = null, int? stage = null)
{
var query = "[document].[CreateRegCaseCustomerDocument]";
var documentTable = new DataTable();
documentTable.Columns.Add("@fileName", typeof(string));
documentTable.Columns.Add("@title", typeof(string));
documentTable.Columns.Add("@description", typeof(string));
documentTable.Columns.Add("@contentType", typeof(string));
documentTable.Columns.Add("@customerDocumentTypeSourceId", typeof(Guid));
documentTable.Columns.Add("@content", typeof(byte[]));
documentTable.Columns.Add("@taskId", typeof(int));
documentTable.Columns.Add("@stage", typeof(int));
documentTable.Rows.Add(fileName, title, description, contentType, customerDocumentTypeSourceId, content, taskId, stage);
var parameters = new DynamicParameters(new
{
_currentUser.CustomerId,
_currentUser.UserId,
regCaseSourceId,
documentInput = documentTable.AsTableValuedParameter("[document].[DocumentInput_12]"),
_currentUser.CustomEntityId
});
var result = await _dataAccessService.ExecuteScalarAsync(
DataSource.Customer,
query,
parameters,
CommandType.StoredProcedure);
return result;
}
Und in meiner gespeicherten Prozedur habe ich NVARCHAR nur für Titel und Dateinamen verwendet:
Code: Select all
CREATE PROCEDURE [document].[CreateRegCaseCustomerDocument]
@customerId UNIQUEIDENTIFIER,
@userId UNIQUEIDENTIFIER,
@regCaseSourceId UNIQUEIDENTIFIER,
@documentInput [document].[DocumentInput_12] READONLY,
@customEntityId UNIQUEIDENTIFIER
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
BEGIN TRAN SaveDocument
DECLARE @regCaseId INT = (SELECT RegCaseId
FROM [regflow].[RegCase] RC
WHERE RC.RegCaseSourceId = @regCaseSourceId
AND RC.CustomEntitySourceId = @customEntityId);
IF @regCaseId IS NULL
THROW 50001, 'RegCase does not exist.', 1;
SELECT @regCaseId = RegcaseId
FROM [regflow].[regcase]
WHERE CustomerId = @customerId
AND CustomEntitySourceId = @customEntityId
AND RegCaseSourceId = @regCaseSourceId
AND IsDeleted = 0;
-- Iterate through each row in the TVP and insert documents
CREATE TABLE #DocumentRow
(
CustomerDocumentSourceId UNIQUEIDENTIFIER,
[Title] NVARCHAR(250)
);
CREATE TABLE #DocumentInput
(
[FileName] NVARCHAR(250),
[Title] NVARCHAR(250),
[Description] VARCHAR(MAX),
ContentType VARCHAR(250),
CustomerDocumentTypeSourceId UNIQUEIDENTIFIER,
Content VARBINARY(MAX),
TaskId INT,
Stage INT,
CustomerDocumentSourceId UNIQUEIDENTIFIER NULL
)
INSERT INTO #DocumentInput([FileName], [Title], [Description], ContentType, CustomerDocumentTypeSourceId, Content, TaskId, Stage)
SELECT
CAST([FileName] AS NVARCHAR(250)), CAST([Title] AS NVARCHAR(250)),
[Description], ContentType, CustomerDocumentTypeSourceId,
Content, TaskId, Stage
FROM
@documentInput
-- Insert document metadata for each document in the temp table
INSERT INTO [document].[CustomerDocumentMetadata]
(CustomerId, CustomerDocumentTypeId, [FileName], Title, [Description], ContentType, CreatedBy, UpdatedBy, CustomEntitySourceId)
OUTPUT inserted.CustomerDocumentSourceId, inserted.[Title] INTO #DocumentRow
SELECT
@customerId,
(SELECT CustomerDocumentTypeId
FROM [document].[CustomerDocumentType]
WHERE CustomerDocumentTypeSourceId = DI.CustomerDocumentTypeSourceId) AS CustomerDocumentTypeId,
DI.[FileName], DI.Title, DI.[Description], DI.ContentType,
@userId, @userId, @customEntityId
FROM
@documentInput DI;
UPDATE D
SET D.CustomerDocumentSourceId = DR.CustomerDocumentSourceId
FROM #DocumentInput D
INNER JOIN #DocumentRow DR ON DR.Title = D.Title
-- Insert the document content for each document
INSERT INTO [document].[CustomerDocumentContent] (CustomerDocumentId, Content)
SELECT
CD.CustomerDocumentId,
DI.Content
FROM
[document].[CustomerDocumentMetadata] CD
INNER JOIN
#DocumentInput DI ON DI.CustomerDocumentSourceId = CD.CustomerDocumentSourceId
WHERE
CD.CustomerId = @customerId
AND CD.CustomEntitySourceId = @customEntityId
AND CD.IsDeleted = 0
-- Insert relationships into the RegCaseRel table
INSERT INTO [document].[CustomerDocumentRegCaseRel]
(RegCaseId, TaskId, Stage, CustomerDocumentId, CreatedBy, UpdatedBy)
SELECT
@regCaseId,
DI.TaskId, DI.Stage,
CD.CustomerDocumentId,
@userId, @userId
FROM
[document].[CustomerDocumentMetadata] CD
INNER JOIN
#DocumentInput DI ON DI.CustomerDocumentSourceId = CD.CustomerDocumentSourceId
WHERE
CD.CustomerId = @customerId
AND CD.CustomEntitySourceId = @customEntityId
AND CD.IsDeleted = 0
Typ:
Code: Select all
CREATE TYPE [document].[DocumentInput_12] AS TABLE
(
[FileName] NVARCHAR(250),
[Title] NVARCHAR(250),
[Description] VARCHAR(MAX),
ContentType VARCHAR(250),
CustomerDocumentTypeSourceId UNIQUEIDENTIFIER,
Content VARBINARY(MAX),
TaskId INT,
Stage INT
)
In der API-Anfrage habe ich „Щодо+внесення+змін+до+“ als Dateinamen verwendet. Titel und Dateiname werden weiterhin als „????“ in der SQL Server-Datenbanktabelle gespeichert. Ich brauche dabei Ihre Unterstützung.
Ich erstelle eine Angular- und C#-.NET-App. Ich habe ein Problem mit nicht-englischen Zeichen, die in meiner Datenbank gespeichert sind.
Das ist mein Code:
[code]public async Task CreateRegCaseCustomerDocumentAsync(string title, string description, string fileName, string contentType, byte[] content, Guid regCaseSourceId, Guid customerDocumentTypeSourceId, int? taskId = null, int? stage = null)
{
var query = "[document].[CreateRegCaseCustomerDocument]";
var documentTable = new DataTable();
documentTable.Columns.Add("@fileName", typeof(string));
documentTable.Columns.Add("@title", typeof(string));
documentTable.Columns.Add("@description", typeof(string));
documentTable.Columns.Add("@contentType", typeof(string));
documentTable.Columns.Add("@customerDocumentTypeSourceId", typeof(Guid));
documentTable.Columns.Add("@content", typeof(byte[]));
documentTable.Columns.Add("@taskId", typeof(int));
documentTable.Columns.Add("@stage", typeof(int));
documentTable.Rows.Add(fileName, title, description, contentType, customerDocumentTypeSourceId, content, taskId, stage);
var parameters = new DynamicParameters(new
{
_currentUser.CustomerId,
_currentUser.UserId,
regCaseSourceId,
documentInput = documentTable.AsTableValuedParameter("[document].[DocumentInput_12]"),
_currentUser.CustomEntityId
});
var result = await _dataAccessService.ExecuteScalarAsync(
DataSource.Customer,
query,
parameters,
CommandType.StoredProcedure);
return result;
}
[/code]
Und in meiner gespeicherten Prozedur habe ich NVARCHAR nur für Titel und Dateinamen verwendet:
[code]CREATE PROCEDURE [document].[CreateRegCaseCustomerDocument]
@customerId UNIQUEIDENTIFIER,
@userId UNIQUEIDENTIFIER,
@regCaseSourceId UNIQUEIDENTIFIER,
@documentInput [document].[DocumentInput_12] READONLY,
@customEntityId UNIQUEIDENTIFIER
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
BEGIN TRAN SaveDocument
DECLARE @regCaseId INT = (SELECT RegCaseId
FROM [regflow].[RegCase] RC
WHERE RC.RegCaseSourceId = @regCaseSourceId
AND RC.CustomEntitySourceId = @customEntityId);
IF @regCaseId IS NULL
THROW 50001, 'RegCase does not exist.', 1;
SELECT @regCaseId = RegcaseId
FROM [regflow].[regcase]
WHERE CustomerId = @customerId
AND CustomEntitySourceId = @customEntityId
AND RegCaseSourceId = @regCaseSourceId
AND IsDeleted = 0;
-- Iterate through each row in the TVP and insert documents
CREATE TABLE #DocumentRow
(
CustomerDocumentSourceId UNIQUEIDENTIFIER,
[Title] NVARCHAR(250)
);
CREATE TABLE #DocumentInput
(
[FileName] NVARCHAR(250),
[Title] NVARCHAR(250),
[Description] VARCHAR(MAX),
ContentType VARCHAR(250),
CustomerDocumentTypeSourceId UNIQUEIDENTIFIER,
Content VARBINARY(MAX),
TaskId INT,
Stage INT,
CustomerDocumentSourceId UNIQUEIDENTIFIER NULL
)
INSERT INTO #DocumentInput([FileName], [Title], [Description], ContentType, CustomerDocumentTypeSourceId, Content, TaskId, Stage)
SELECT
CAST([FileName] AS NVARCHAR(250)), CAST([Title] AS NVARCHAR(250)),
[Description], ContentType, CustomerDocumentTypeSourceId,
Content, TaskId, Stage
FROM
@documentInput
-- Insert document metadata for each document in the temp table
INSERT INTO [document].[CustomerDocumentMetadata]
(CustomerId, CustomerDocumentTypeId, [FileName], Title, [Description], ContentType, CreatedBy, UpdatedBy, CustomEntitySourceId)
OUTPUT inserted.CustomerDocumentSourceId, inserted.[Title] INTO #DocumentRow
SELECT
@customerId,
(SELECT CustomerDocumentTypeId
FROM [document].[CustomerDocumentType]
WHERE CustomerDocumentTypeSourceId = DI.CustomerDocumentTypeSourceId) AS CustomerDocumentTypeId,
DI.[FileName], DI.Title, DI.[Description], DI.ContentType,
@userId, @userId, @customEntityId
FROM
@documentInput DI;
UPDATE D
SET D.CustomerDocumentSourceId = DR.CustomerDocumentSourceId
FROM #DocumentInput D
INNER JOIN #DocumentRow DR ON DR.Title = D.Title
-- Insert the document content for each document
INSERT INTO [document].[CustomerDocumentContent] (CustomerDocumentId, Content)
SELECT
CD.CustomerDocumentId,
DI.Content
FROM
[document].[CustomerDocumentMetadata] CD
INNER JOIN
#DocumentInput DI ON DI.CustomerDocumentSourceId = CD.CustomerDocumentSourceId
WHERE
CD.CustomerId = @customerId
AND CD.CustomEntitySourceId = @customEntityId
AND CD.IsDeleted = 0
-- Insert relationships into the RegCaseRel table
INSERT INTO [document].[CustomerDocumentRegCaseRel]
(RegCaseId, TaskId, Stage, CustomerDocumentId, CreatedBy, UpdatedBy)
SELECT
@regCaseId,
DI.TaskId, DI.Stage,
CD.CustomerDocumentId,
@userId, @userId
FROM
[document].[CustomerDocumentMetadata] CD
INNER JOIN
#DocumentInput DI ON DI.CustomerDocumentSourceId = CD.CustomerDocumentSourceId
WHERE
CD.CustomerId = @customerId
AND CD.CustomEntitySourceId = @customEntityId
AND CD.IsDeleted = 0
[/code]
[code][document].[DocumentInput_12][/code] Typ:
[code]CREATE TYPE [document].[DocumentInput_12] AS TABLE
(
[FileName] NVARCHAR(250),
[Title] NVARCHAR(250),
[Description] VARCHAR(MAX),
ContentType VARCHAR(250),
CustomerDocumentTypeSourceId UNIQUEIDENTIFIER,
Content VARBINARY(MAX),
TaskId INT,
Stage INT
)
[/code]
In der API-Anfrage habe ich „Щодо+внесення+змін+до+“ als Dateinamen verwendet. Titel und Dateiname werden weiterhin als „????“ in der SQL Server-Datenbanktabelle gespeichert. Ich brauche dabei Ihre Unterstützung.