diff --git a/crates/dbx-core/src/db/sqlserver.rs b/crates/dbx-core/src/db/sqlserver.rs index cde325e67f..fa05f6f2e9 100644 --- a/crates/dbx-core/src/db/sqlserver.rs +++ b/crates/dbx-core/src/db/sqlserver.rs @@ -129,10 +129,26 @@ pub async fn get_columns(client: &mut SqlServerClient, schema: &str, table: &str .iter() .map(|row| { let base = row.get::<&str, _>(1).unwrap_or("").to_string(); - let max_len = row.get::(7); - let dt_prec = row.get::(8); - let num_prec = row.get::(5); - let num_scale = row.get::(6); + let max_len = row + .try_get::(7) + .ok() + .flatten() + .or_else(|| row.try_get::(7).ok().flatten().map(|v| v as i32)); + let dt_prec = row + .try_get::(8) + .ok() + .flatten() + .or_else(|| row.try_get::(8).ok().flatten().map(|v| v as i32)); + let num_prec = row + .try_get::(5) + .ok() + .flatten() + .or_else(|| row.try_get::(5).ok().flatten().map(|v| v as i32)); + let num_scale = row + .try_get::(6) + .ok() + .flatten() + .or_else(|| row.try_get::(6).ok().flatten().map(|v| v as i32)); let data_type = match base.to_lowercase().as_str() { "varchar" => match max_len { Some(-1) => "varchar(max)".to_string(), diff --git a/src/lib/dataGridSql.ts b/src/lib/dataGridSql.ts index 0c00c86969..c9b6012767 100644 --- a/src/lib/dataGridSql.ts +++ b/src/lib/dataGridSql.ts @@ -33,7 +33,7 @@ export function buildDataGridSaveStatements(options: DataGridSaveStatementOption const sets = changes .map( ([columnIndex, value]) => - `${quoteIdent(options.databaseType, options.columns[columnIndex])} = ${formatGridSqlLiteral(value)}`, + `${quoteIdent(options.databaseType, options.columns[columnIndex])} = ${formatGridSqlLiteral(value, options.databaseType)}`, ) .join(", "); const where = buildPrimaryKeyWhere(options.databaseType, options.tableMeta.primaryKeys, options.columns, row); @@ -49,20 +49,21 @@ export function buildDataGridSaveStatements(options: DataGridSaveStatementOption for (const row of options.newRows) { const columns = options.columns.map((column) => quoteIdent(options.databaseType, column)).join(", "); - const values = row.map(formatGridSqlLiteral).join(", "); + const values = row.map((v) => formatGridSqlLiteral(v, options.databaseType)).join(", "); statements.push(`INSERT INTO ${table} (${columns}) VALUES (${values});`); } return statements; } -export function formatGridSqlLiteral(value: GridCellValue): string { +export function formatGridSqlLiteral(value: GridCellValue, databaseType?: DatabaseType): string { if (value === null || value === undefined) return "NULL"; if (typeof value === "boolean") return value ? "TRUE" : "FALSE"; if (typeof value === "number" && Number.isFinite(value)) return String(value); const text = String(value); - if (text === "") return "''"; - return `'${text.replace(/\\/g, "\\\\").replace(/'/g, "''")}'`; + if (text === "") return databaseType === "sqlserver" ? "N''" : "''"; + const escaped = `'${text.replace(/\\/g, "\\\\").replace(/'/g, "''")}'`; + return databaseType === "sqlserver" ? `N${escaped}` : escaped; } function buildPrimaryKeyWhere( @@ -74,7 +75,7 @@ function buildPrimaryKeyWhere( return primaryKeys .map((primaryKey) => { const value = row[columns.indexOf(primaryKey)]; - return `${quoteIdent(databaseType, primaryKey)} = ${formatGridSqlLiteral(value)}`; + return `${quoteIdent(databaseType, primaryKey)} = ${formatGridSqlLiteral(value, databaseType)}`; }) .join(" AND "); }