PDA

View Full Version : آپدیت دیتابیس WEb از طریق برنامه



mina.net
جمعه 09 بهمن 1388, 20:43 عصر
سلام دوستان
من یک برنامه اداری نوشتم که الان داره کار می کنه. این شرکت الان تصمیم گرفته که قسمتی از اطلاعات همین برنامه رو روی سایت قرار بده(قسمتی که مورد نیاز مشتریهاشون هست) تا مشتری بتونه از اون طریق روند سفارش خودش رو پیگیری کنه. در ضمن نمی خواهیم دوباره کاری انجام بشه یعنی کاربر مجبور نباشه اطلاعات را دوبار وارد کنه ، کمترین هزینه رو داشته باشه و با توجه به اینکه این شرکت بیرون از شهر هست نمی تونه اینترنت پر سرعت داشته باشه.
همکارم که قرار است وب سایت رو طراحی کنه به من گفته اگه از دیتابیس اسکریپت تهیه بشه می تونه ترتیبی بده که دیتابیس web از این طریق آپدیت بشه.

نکته : برای این شرکت مهم این هست که دیتابیس هر حداقل 3-4 ساعت آپدیت بشه و آپدیت انلاین احتیاج نداره.

لطفا بهترین راه ممکن رو پیشنهاد بدین. ممنون

Alghoochi
جمعه 09 بهمن 1388, 21:35 عصر
دائم به اینترنت وصل هستند یا اینکه می خوای هر چند ساعت یکبار دیتابیس وب بروز بشه؟

mina.net
شنبه 10 بهمن 1388, 20:17 عصر
دائم به اینترنت وصل هستند یا اینکه می خوای هر چند ساعت یکبار دیتابیس وب بروز بشه؟

سلام
توضیح دادم . هر چند ساعت یکبار (حداکثر روزی 4 بار).

davood-ahmadi
یک شنبه 11 بهمن 1388, 11:28 صبح
دیتابیس برنامه تون چیه؟
و چند تا از جداولتون رو می خواهید هر دفعه آپدیت کنید؟
تقریباً هر جدول چند رکورد داره؟

mina.net
سه شنبه 13 بهمن 1388, 09:00 صبح
دیتابیس برنامه تون چیه؟
و چند تا از جداولتون رو می خواهید هر دفعه آپدیت کنید؟
تقریباً هر جدول چند رکورد داره؟

سلام
دیتابیسم SQL هست.
خودم اینطور فکر می کنم که اطلاعات جدید که هنوز آپدیت نشده رو تو یک جدول جداگانه بریزم و از اطلاعات جدید یک اسکریپت (insert script) تهیه کنم و اطلاعات جدید رو تو دیتابیس وب سایت اضافه کنم.

این که اطلاعات جدید رو جدا کنم و داخل یک جدول جداگانه بریزم رو می دونم ولی این که یک اسکریپت (insert script) ازش تهیه کنم رو بلد نیستم.

davood-ahmadi
سه شنبه 13 بهمن 1388, 13:00 عصر
من خودم همین مسئله رو داشتم که با روش زیر چندین جدول از یک دیتابیس اسکیوال به یک اسکیو ال دیگر به نمایندگی فرعی انتقال دادم
خوب شد که SQL است
چون خود دات نت یک کلاس بنام SQLBulkCopy دارد که مخصوص همین کار شماست
در مرحله اول شما باید جدول مقصد را با دستور ترانکت خالی کنید و سپس با دستور این کلاس از جدول مبدا آنرا پر کنید
نمونه زیر :
در ابتدا باید دو تا کانکشن تعریف کنید که اولی به مبدا و دومی به مقصد تنظیم شوند



Dim Cnn As SqlConnection
Dim Cnn2 As SqlConnection
Dim SBulk As SqlBulkCopy
Cnn = New SqlConnection(StrCnn1)
Cnn2 = New SqlConnection(StrCnn2)سپس یک کلاس از نوع SqlBulkCopy بسازید و کانکشن مقصد را به آن معرفی کنید

SBulk = New SqlBulkCopy(Cnn2)سپس اطلاعات جدول مقصد را حذف کنید


Dim CmdDelete As New SqlClient.SqlCommand("TRUNCATE TABLE Table1", Cnn2)
Cnn2.Open()
CmdDelete.ExecuteNonQuery()
سپس از جدول مبدا اطلاعات را خوانده و درون یک دیتاریدر بریزید

Cnn.Open()
Dim CmdSelect As New SqlClient.SqlCommand(StrQuery, Cnn)
Dim Dr As SqlClient.SqlDataReader = CmdSelect.ExecuteReader
SBulk.BulkCopyTimeout = 500000
SBulk.BatchSize = TimeOut
SBulk.DestinationTableName = "Table1"
SBulk.WriteToServer(Dr)
دقت داشته باشید که مشخصات ستونهای جداول مبدا و مقصد باید یکی باشد

Alghoochi
سه شنبه 13 بهمن 1388, 14:18 عصر
من خودم همین مسئله رو داشتم که با روش زیر چندین جدول از یک دیتابیس اسکیوال به یک اسکیو ال دیگر به نمایندگی فرعی انتقال دادم
خوب شد که SQL است
چون خود دات نت یک کلاس بنام SQLBulkCopy دارد که مخصوص همین کار شماست
در مرحله اول شما باید جدول مقصد را با دستور ترانکت خالی کنید و سپس با دستور این کلاس از جدول مبدا آنرا پر کنید
نمونه زیر :
در ابتدا باید دو تا کانکشن تعریف کنید که اولی به مبدا و دومی به مقصد تنظیم شوند



Dim Cnn As SqlConnection
Dim Cnn2 As SqlConnection
Dim SBulk As SqlBulkCopy
Cnn = New SqlConnection(StrCnn1)
Cnn2 = New SqlConnection(StrCnn2)سپس یک کلاس از نوع SqlBulkCopy بسازید و کانکشن مقصد را به آن معرفی کنید

SBulk = New SqlBulkCopy(Cnn2)سپس اطلاعات جدول مقصد را حذف کنید


Dim CmdDelete As New SqlClient.SqlCommand("TRUNCATE TABLE Table1", Cnn2)
Cnn2.Open()
CmdDelete.ExecuteNonQuery()
سپس از جدول مبدا اطلاعات را خوانده و درون یک دیتاریدر بریزید

Cnn.Open()
Dim CmdSelect As New SqlClient.SqlCommand(StrQuery, Cnn)
Dim Dr As SqlClient.SqlDataReader = CmdSelect.ExecuteReader
SBulk.BulkCopyTimeout = 500000
SBulk.BatchSize = TimeOut
SBulk.DestinationTableName = "Table1"
SBulk.WriteToServer(Dr)
دقت داشته باشید که مشخصات ستونهای جداول مبدا و مقصد باید یکی باشد
این کار پهنای باند زیادی می خواد. اگه پهنای باند سرورشون محدود باشه چی؟

mina.net
سه شنبه 13 بهمن 1388, 15:30 عصر
سلام دوستان
از این کد هنوز نمی تونم استفاده کنم. ولی چون WEB آماده ای نداریم. ولی اینطور که مثوجه شدم اطلاعات جدید رو مستقیم به دیتابیس WEBمنتقل می کنه. تو این شرکت روزانه حدود 100 سطر رکورد ، با احتمالا 8-12 ستون رو باید به دیتابیس WEB انتقال داد. با دیالاپ چقدر طول می کشه(به طور متوسط)؟در ضمن دیتابیس مقصد با MY SQL هست. آیا مستقما می شه به داخل دیتابیس WEB اطلاعات insert کنم ؟ لطفا یک مثال بزنید. دستور insert رو به من بگید بقیه رو می دونم چیکار کنم.

mina.net
سه شنبه 13 بهمن 1388, 15:55 عصر
فکر می کنم اشتباه متوجه شده بودم. ظاهرا با این روشی که دوست مون جناب davood-ahmadi (http://barnamenevis.org/forum/member.php?u=33827) گفتن همه اطلاعات قبلی پاک شده و دوباره وارد می شود. درسته؟
اگه درست باشه این روند به شدت وقت گیر خواهد بود. چون تعداد رکورد ها ممکن هست تا 100،000 هم برسه.

mina.net
سه شنبه 13 بهمن 1388, 18:37 عصر
سلام دوستان
من از کد زیر با توجه به راهنمایی که دوست خوبمون جناب davood-ahmadi کردن برای انتقال اطلاعات از یک table به table دیگه استفاده کردم.


Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim connectionString AsString = GetConnectionString()
Using sourceConnection As SqlConnection = _
New SqlConnection(connectionString)
sourceConnection.Open()
Dim commandRowCount AsNew SqlCommand( _
"SELECT COUNT(*) FROM khadamat;", _
sourceConnection)
Dim countStart AsLong = _
System.Convert.ToInt32(commandRowCount.ExecuteScal ar())
Console.WriteLine("Starting row count = {0}", countStart)

Dim commandSourceData As SqlCommand = New SqlCommand( _
"SELECT id FROM khadamat;", sourceConnection)
Dim reader As SqlDataReader = commandSourceData.ExecuteReader
Using destinationConnection As SqlConnection = _
New SqlConnection(connectionString)
destinationConnection.Open()
Using bulkCopy As SqlBulkCopy = _
New SqlBulkCopy(destinationConnection)
bulkCopy.DestinationTableName = _
"tb1"
Try
bulkCopy.WriteToServer(reader)
Catch ex As Exception
Finally
reader.Close()
EndTry
EndUsing
EndUsing
EndUsing
EndSub
PrivateFunction GetConnectionString() AsString
Return"Data Source=(local);" & _
"Integrated Security=true;" & _
"Initial Catalog=farsh;"
EndFunction
EndModule


به فکر رسید که یک فیلد از به نام ADDWEB نوع بایت تعریف کنم و اگر مقدار false بود یعنی این سطر به دیتابیسweb اضافه نشده و باید الان اضافه بشه و بعد از اضافه true بشه.
ولی برای آپدیت مشکل دارم. یعنی اگه دیتابیس بعدا ویرایش بشه باید چیکار کرد؟
فکر کردم همه سطرهای که بعدا ویرایش می شه مقدار فیلد ADDWEB دوباره false بشه. خوب حالا باید همه سطرهای جدول اول که فیلد ADDWEB شان false هست را پیدا کرد و سطرهای نظیر اون رو تو جدول دوم حذف کرد و سپس اقدام به اضافه کردن همه اطلاعات ویرایش شده یا جدید کرد.
مشکلم در حذف کردن سطرهای جدول دوم هست که شرط قسمت قرمز شده (دو سطر بالا) رو داشته باشند. باید چه دستور SQL ی بنویسم.
امیدوارم منظورم را درست رسونده باشم.