PDA

View Full Version : نوع DATA TAPE برای فیلد



majid2
جمعه 16 دی 1390, 11:42 صبح
با سلام
من یک رشته را بصورت کد در آوردم(Encrypt) و در هنگام ذخیره کردن در تیبل مربوطه پیغام
Incorrect syntax near ...
رو میدهد(البته برای بعضی از رشته خطا میدهد نه برای همه)
نوع فیلد رو هم از نوع varchar بوده و به text و nvarchar هم تغییر دادم باز هم خطا میدهد
نوع فیلد ور باید چی بذارم تا هر نوع کارکتر رو قبول کند؟
(من با sql server 2008 کار میکنم)

linux
جمعه 16 دی 1390, 12:16 عصر
با سلام
من یک رشته را بصورت کد در آوردم(Encrypt) و در هنگام ذخیره کردن در تیبل مربوطه پیغام
Incorrect syntax near ...
رو میدهد(البته برای بعضی از رشته خطا میدهد نه برای همه)
نوع فیلد رو هم از نوع varchar بوده و به text و nvarchar هم تغییر دادم باز هم خطا میدهد
نوع فیلد ور باید چی بذارم تا هر نوع کارکتر رو قبول کند؟
(من با sql server 2008 کار میکنم)
مهم این هست که خروجی رمز شده را به چه صورتی ذخیره می کنید، پیشنهاد می کنم خروجی را به صورت عدد در مبنای 64 ذخیره کنید. در این صورت می توانید به راحتی در nvarchar(max) ذخیره کنید، اگر خروجی به صورت آرایه از بایتها خواستید ذخیره کنید در sqlserver2000 نوع image و در 2008 نوع varbainary(max)

یوسف زالی
جمعه 16 دی 1390, 18:20 عصر
سلام.
معمولا برای ذخیره داده کد شده از varbinary استفاده می شه.
استفاده از نوع داده image طبق مستندات ماکروسافت دیگه توصیه نمی شه.

baktash.n81@gmail.com
شنبه 17 دی 1390, 20:58 عصر
سلام .... لطفا قطعه کدتون رو بزارید هم قسمت Encrypt هم مربوط به Insert .... به نظرم مشکل از نوع داده نیست ...

majid2
یک شنبه 18 دی 1390, 14:07 عصر
سلام .... لطفا قطعه کدتون رو بزارید هم قسمت Encrypt هم مربوط به Insert .... به نظرم مشکل از نوع داده نیست ...
سلام دوست عزیز فکر نکنم که ربطی به تابع Encrypt داشته باشد چون بدون ذخیره سازی ، تمامی رشته ها درست کد میکند


function Encrypt(Text : string; Key1, Key2, Key3, Key4 : Integer) :
string;
var
BufS, Hexa, Hexa1, Hexa2 : string;
BufI, BufI2, Sc, Sl, Num1, Num2, Num3, Num4, Res1, Res2, Res3, Res4
: Integer;
begin
Sl := Length(Text);
Sc := 0;
BufS := '';
if (Key1 in [1 .. 120]) and (Key2 in [1 .. 120]) and (Key3 in [1 ..
120]) and (Key4 in [1 .. 120]) then
begin
BufI := Key1 * Key4;
BufI2 := Key3 * Key2;
BufI := BufI - BufI2;
if BufI = 0 then
begin
Result := '';
Exit;
end;
end
else
begin
Result := '';
Exit;
end;
repeat
Inc(Sc);
if Sc > Sl then Num1 := 0 else Num1 := Ord(Text[Sc]);
Inc(Sc);
if Sc > Sl then Num2 := 0 else Num2 := Ord(Text[Sc]);
Inc(Sc);
if Sc > Sl then Num3 := 0 else Num3 := Ord(Text[Sc]);
Inc(sc);
if Sc > Sl then Num4 := 0 else Num4 := Ord(Text[Sc]);
Res1 := Num1 * Key1;
BufI := Num2 * Key3;
Res1 := Res1 + BufI;
Res2 := Num1 * Key2;
BufI := Num2 * Key4;
Res2 := Res2 + BufI;
Res3 := Num3 * Key1;
BufI := Num4 * Key3;
Res3 := Res3 + BufI;
Res4 := Num3 * Key2;
BufI := Num4 * Key4;
Res4 := Res4 + BufI;
for BufI := 1 to 4 do
begin
case BufI of
1 : Hexa := IntToHex(Res1, 4);
2 : Hexa := IntToHex(Res2, 4);
3 : Hexa := IntToHex(Res3, 4);
4 : Hexa := IntToHex(Res4, 4);
end;
Hexa1 := '$' + Hexa[1] + Hexa[2];
Hexa2 := '$' + Hexa[3] + Hexa[4];
if (Hexa1 = '$00') and (Hexa2 = '$00') then
begin
Hexa1 := '$BD';
Hexa2 := '$BD';
end;
if Hexa1 = '$00' then
Hexa1 := '$FE';
if Hexa2 = '$00' then
begin
Hexa2 := Hexa1;
Hexa1 := '$FD';
end;
BufS := BufS + Chr(StrToInt(Hexa1)) + Chr(StrToInt(Hexa2));
end;
until Sc >= Sl;
Result := BufS;
end;

//............

majid2
یک شنبه 18 دی 1390, 14:58 عصر
سلام.
معمولا برای ذخیره داده کد شده از varbinary استفاده می شه.
استفاده از نوع داده image طبق مستندات ماکروسافت دیگه توصیه نمی شه.
سلام دوست عزیز نه varbinary و نه با image جواب نداد و خطا میدهد

majid2
یک شنبه 18 دی 1390, 16:34 عصر
این هم چند نمونه خطای ذخیره کردن........
این کارکتر را با تعریف چه نوع data type ذخیره کرد.

majid2
یک شنبه 18 دی 1390, 18:19 عصر
تبدیل رشته مورد نظر به کد:
حال این رشته کددار شده را با چه نوع datatype ذخیره کنیم؟

baktash.n81@gmail.com
دوشنبه 19 دی 1390, 07:47 صبح
خوب ببین فکر کنم رشته ایی که می سازی کارکتر هایی هست که باعث می شه کد SQL خراب بشه ... مثلا کاراکتر ' ... الان همین رشته ای که نوشتی رو به راحتی نمی تونی تو دستور Insert قرار بدی .. چه جوری خروجی این تابع رو تو دستور Insert قرار می دی ؟

linux
دوشنبه 19 دی 1390, 09:45 صبح
این هم چند نمونه خطای ذخیره کردن........
این کارکتر را با تعریف چه نوع data type ذخیره کرد.

خروجی را طوری تغییر بدهید که یک عدد در مبنای 16 باشد چیزی شبیه 0x121234ab4bc123d09e12 شود

majid2
دوشنبه 19 دی 1390, 14:19 عصر
خوب ببین فکر کنم رشته ایی که می سازی کارکتر هایی هست که باعث می شه کد SQL خراب بشه ... مثلا کاراکتر ' ... الان همین رشته ای که نوشتی رو به راحتی نمی تونی تو دستور Insert قرار بدی .. چه جوری خروجی این تابع رو تو دستور Insert قرار می دی ؟

سلام از اینکه پیگیر مشکل من هستید ممنونم
با دستور insert معمولی مثل(insert into table(filed1)values(str_Encrypt))

majid2
دوشنبه 19 دی 1390, 14:26 عصر
خروجی را طوری تغییر بدهید که یک عدد در مبنای 16 باشد چیزی شبیه 0x121234ab4bc123d09e12 شود
سلام از اینکه پیگیر مشکل من هستید ممنونم
یعنی بعد از Encrypt کردن رشته آنرا به مبنای 16 ببرم و یا اینکه از ابتدا رشته را بجای Encrypt ، به مبنای 16 ببرم؟
(من بیشتر می خوام که ببینم که مشکل کجاست و چطور رفع میشه)

یوسف زالی
دوشنبه 19 دی 1390, 17:00 عصر
من فکر می کنم مشکل شما یکی از این دو حالت هست:
1- وقتی نوع داده رو varchar می گیرید و ذخیره می کنید، در رشته خروجی کاراکتر ' وجود داره که با دابل کردن اون مشکل حل می شه.
2- وقتی نوع داده رو varbinary می گیرید برای اینسرت تبدیل نوع انجام بدید. cast(str_encript as varbinary(max)) -- sql .
در زمینه تبدیل به مبنای 16 اصلا چنین چیزی نیاز نیست.
مگه تصاویر رو ما به مبنا می بریم؟
همون طور که تصاویر رو ذخیره و بازیابی می کنید می تونید هرچیز دیگه ای رو هم ذخیره و بازیابی کنید.
امیدوارم توضیحاتم کافی بوده باشه.
موفق باشید.

linux
دوشنبه 19 دی 1390, 21:29 عصر
من فکر می کنم مشکل شما یکی از این دو حالت هست:
1- وقتی نوع داده رو varchar می گیرید و ذخیره می کنید، در رشته خروجی کاراکتر ' وجود داره که با دابل کردن اون مشکل حل می شه.
2- وقتی نوع داده رو varbinary می گیرید برای اینسرت تبدیل نوع انجام بدید. cast(str_encript as varbinary(max)) -- sql .
در زمینه تبدیل به مبنای 16 اصلا چنین چیزی نیاز نیست.
مگه تصاویر رو ما به مبنا می بریم؟
همون طور که تصاویر رو ذخیره و بازیابی می کنید می تونید هرچیز دیگه ای رو هم ذخیره و بازیابی کنید.
امیدوارم توضیحاتم کافی بوده باشه.
موفق باشید.

تصویر یا هر چیز دیگر چیزی نیست جز آرایه از بایتها! بایت هم چیزی نیست جز 8 تا 0 و1 برای نمایش هر جوری که لازم باشد می توانیم اقدام کنیم، با توجه به نوع خروجی و این که می خواستند در varchar ذخیره کنند این را پیشنهاد کردم.

یوسف زالی
دوشنبه 19 دی 1390, 23:08 عصر
دوست عزیز به خودتون نگیرید.
اگر هرچیزی در مبنای 16 هست پس چرا داشتید تبدیل می کردید؟
یه کمی در مورد این قضیه دچار تسلسل شدیم!


با توجه به نوع خروجی و این که می خواستند در varchar ذخیره کنند این را پیشنهاد کردم

همونطور که از من بهتر می دونید varchar نیازی نداره به مبنا.
مثلا کاراکتر G در مبنای 16 معنی نداره ولی varchar هست.
مشکل در ' هست که با دوبل کردن اون مشکل رفع می شه.

پ.ن.
---------
تمام چیزها در مبنای 8 و 16 و 32 و 64 قابل توصیفه.
به خاطر مسایل قدیمی 8 رو پایه در نظر گرفتند.
این که هرچیزی در مبنای دودویی و مشتقات و ضرایب اون ذخیره می شه و می تونه نفسیر بشه شکی درش نیست.
بحث اینجاست که چه موقع نیاز هست که تبدیل فرمت کاراکترهای نمایشی رو به اعداد متناظر انجام بدیم که خودش به تنهایی یعنی عوض شدن ماهیت دیتا.
در این مثال که مطرح شد نیازی به این کار نبود. نه اینکه نمی شه اون کار رو انجام داد.
بهترین راه پیچیده ترینش نیست.

امیدوارم باعث سوء تفاهم سروران قدیمی نشده باشم.

linux
سه شنبه 20 دی 1390, 08:18 صبح
دوست عزیز به خودتون نگیرید.
اگر هرچیزی در مبنای 16 هست پس چرا داشتید تبدیل می کردید؟
یه کمی در مورد این قضیه دچار تسلسل شدیم!

همونطور که از من بهتر می دونید varchar نیازی نداره به مبنا.
مثلا کاراکتر G در مبنای 16 معنی نداره ولی varchar هست.
مشکل در ' هست که با دوبل کردن اون مشکل رفع می شه.

پ.ن.
---------
تمام چیزها در مبنای 8 و 16 و 32 و 64 قابل توصیفه.
به خاطر مسایل قدیمی 8 رو پایه در نظر گرفتند.
این که هرچیزی در مبنای دودویی و مشتقات و ضرایب اون ذخیره می شه و می تونه نفسیر بشه شکی درش نیست.
بحث اینجاست که چه موقع نیاز هست که تبدیل فرمت کاراکترهای نمایشی رو به اعداد متناظر انجام بدیم که خودش به تنهایی یعنی عوض شدن ماهیت دیتا.
در این مثال که مطرح شد نیازی به این کار نبود. نه اینکه نمی شه اون کار رو انجام داد.
بهترین راه پیچیده ترینش نیست.

امیدوارم باعث سوء تفاهم سروران قدیمی نشده باشم.
خروجی الگوریتم ایشان به جای یک سری عدد و کارکتر بهتر بود یک آرایه از بایتها می بود، آن وقت به راحتی می توانستند در varbainary ذخیره کنند.

majid2
پنج شنبه 22 دی 1390, 15:29 عصر
خروجی الگوریتم ایشان به جای یک سری عدد و کارکتر بهتر بود یک آرایه از بایتها می بود، آن وقت به راحتی می توانستند در varbainary ذخیره کنند.

سلام
چطور رشته را به آرایه از بایتها تبدیل کنم

spinelruby
پنج شنبه 22 دی 1390, 21:15 عصر
این کلمه رو سرچ کن :
Convert char to binary in C#