powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Создание БД через WCF-сервис
25 сообщений из 61, страница 1 из 3
Создание БД через WCF-сервис
    #38567266
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Нужно через WCF-сервис организовать работу с базой данных...загрузка, выгрузка файлов из БД через клиентское приложение. Я начала с метода создания БД. Но есть загвоздка.
Скрипт для создания БД рабочий, проверялся в sql-менеджере. Метод для создания БД-рабочий, проверялся в windows form application. а в wcf сервисе - БД не создается, по тому же методу с тем же скриптом! ошибка та - мало о чем мне говорит. Самое интересное, что в сервисе у меня 2 метода-создание БД и возврат сообщения. Метод с сообщением - работает! А база не создается. Я в тупике. Помогите пожалуйста, люди добрые :) . Мой маленький проект прилагается.

Вот текст runtime-ошибки из Visual Studio:
The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.

Я организовала лог-файл, вот ещё инфа оттуда:

Exeption type: System.ServiceModel.FaultException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Message: такой же как из runtime.

Stack trace:

Server stack trace:
System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown
[0]:
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
TestDBClient.ServiceReference1.IFileService.CreateDatabase()
TestDBClient.ServiceReference1.FileServiceClient.CreateDatabase() in c:\Users\Administrator\Desktop\MyTest\FileServiceLib\TestDBClient\Service References\ServiceReference1\Reference.cs:line 59
TestDBClient.Program.Main(String[] args) in c:\Users\Administrator\Desktop\MyTest\FileServiceLib\TestDBClient\Program.cs:line 21
System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
System.Threading.ThreadHelper.ThreadStart_Context(Object state)
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
System.Threading.ThreadHelper.ThreadStart()

Я в растерянности. Очень надеюсь на вашу помощь!
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567322
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

авторturn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior)

Это сделали? Если нет, то вот msdn
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567347
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,
я так поняла, это свойство нужно чтоб получить детали ошибки?
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567348
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

да
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567351
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,

спасибо, попробуем...
о результате сообщу.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567385
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,

не совсем поняла, что писать вместо контракта
...
contract=Microsoft.WCF.Documentation.SampleService
...
contract="Microsoft.WCF.Documentation.ISampleService

нужно заменить только SampleService, или полностью имя контракта?
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567403
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

Если у вас уже есть некоторое поведение (behavior) в конфиге сервиса, то добавьте к нему вот такой раздел:
Код: xml
1.
2.
3.
4.
 <serviceDebug 
            httpHelpPageEnabled="true" 
            includeExceptionDetailInFaults="true"
          />



Иначе, скопируйте раздел behaviors из примера на MSDN в конфиг вашего сервиса и укажите в этот атрибут: behaviorConfiguration="metadataAndDebug" в разделе <service> который описывает ваш сервис.

Надеюсь, понятно)
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38567437
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchDessi,

Если у вас уже есть некоторое поведение (behavior) в конфиге сервиса, то добавьте к нему вот такой раздел:
Код: xml
1.
2.
3.
4.
 <serviceDebug 
            httpHelpPageEnabled="true" 
            includeExceptionDetailInFaults="true"
          />



Иначе, скопируйте раздел behaviors из примера на MSDN в конфиг вашего сервиса и укажите в этот атрибут: behaviorConfiguration="metadataAndDebug" в разделе <service> который описывает ваш сервис.

Надеюсь, понятно)

я уже по примеру из msdnразобралась, спасибо)) меня изначально смутил действительно тот факт, что у меня уже был behavior. Но я решила этот вопрос.

И знаете что, Lelouch, мне сразу выдало адекватный текст runtime-ошибки) Оказывается, когда я дебагала метод создания БД в windows form application, то забыла скопировать отредактированный connection string в мой wcf-сервис, и в сервисе остался старый, неправильный!

В общем... включение свойства IncludeExceptionDetailInFaults мне реально помогло понять где я накосячила! Спасибо вам!
БД создалась!!! =)
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570616
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые форумчане.
У меня снова проблема...
Пытаюсь записать файл в таблицу БД в поле типа varbinary(max) через ilestream и sqlfilestream...
бьюсь уже над проблемой несколько дней... ничего не получается(( помогите пожалуйста
смотрела статью:
http://msdn.microsoft.com/ru-ru/library/cc716724(v=vs.110).aspx
так даже там данные в БД вставляются INSERT-запросом, и лишь байтик. А как насчет реального файла?? про большой файл то вообще молчу...
как модифицировать код из статьи, чтобы конкретный файл, например C:\Users\Administrator\Desktop\Image.png загружался в БД в поле типа varbinary(max)?
спасибо.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570661
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570668
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соответственно, при insert можно передать в запрос в качестве параметра весь контент файла в байтах.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570678
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,

я читала эту статью. Это всё не то. Опять же, в примерах - вставка записи с нулевой длинной, и вставка строки.

У меня есть приложение. Клацаешь "upload", выбираешь файл и он должен вставиться в поле БД типа varbinary(max).
Прочитала уже тонну информации, но так и не поняла как конкретный файл в базу запилить.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570682
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,
надо на с# организовать всё это дело.
Ну никак не выходит...
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570690
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код с мсдн:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
            {
                connection.Open();

                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);
//понятно, что GET_FILESTREAM_TRANSACTION_CONTEXT  возвращает токен, который представляет текущий контекст транзакции сеанса. Этот токен используется приложением для связывания потоковых операций FILESTREAM файловой системы с транзакцией.
но что конкретно он делает и зачем - не понятно.
                SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
                command.Transaction = tran;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // Get the pointer for file 
                        string path = reader.GetString(0);//вот тут вообще непонятно откуда какой путь берется
                        byte[] transactionContext = reader.GetSqlBytes(1).Buffer; 

                        // Create the SqlFileStream
                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write, FileOptions.SequentialScan, allocationSize: 0))
                        {
                            // Write a single byte to the file. This will replace any data in the file.
                            fileStream.WriteByte(0x01); //и вот снова - запись байта!
                        }
                    }
                }
                tran.Commit();
            }



Такое ощущение, что люди только и делают, что записывают по одному байту в файл. Нету никакого реального примера с реальным файлом...(
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570698
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так и не могу до конца понять, что за transactionContext требует конструктор при создании экземпляра SqlFileStream.
в документации сказано: The transaction context for the SqlFileStream object. Applications should return the byte array returned by calling the GET_FILESTREAM_TRANSACTION_CONTEXT method.
Так что это, этот GET_FILESTREAM_TRANSACTION_CONTEXT, что он представляет собой? Это стрим, в который нужно записать файл, который ты хочешь инсертнуть в БД? что это??
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570701
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

для вставки файла в базу не нужно использовать GET_FILESTREAM_TRANSACTION_CONTEXT(). Достаточно просто вставить строку с контентом в базу.

Ну показали вам в примере запись 1 байта, как это отменяет то, что вставка нового файла выполняется с помощью Insert?

Пример запроса:
Код: sql
1.
2.
3.
4.
INSERT INTO Archive.dbo.Records
    VALUES (newid (), 3, 
      CAST ('Seismic Data' as varbinary(max)));
GO



Вы что, не знаете выполнить insert с помощью C#? оО
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570705
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

Код: c#
1.
string path = reader.GetString(0);//вот тут вообще непонятно откуда какой путь берется



Ну так посмотрите, как FileStream хранится на диске.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570707
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

http://msdn.microsoft.com/ru-ru/library/system.data.sqltypes.sqlfilestream.write(v=vs.110).aspx

а еще у SqlFileStream есть вот такой метод, позволяет писать сразу многобайтов...
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570725
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchDessi,

для вставки файла в базу не нужно использовать GET_FILESTREAM_TRANSACTION_CONTEXT(). Достаточно просто вставить строку с контентом в базу.

Ну показали вам в примере запись 1 байта, как это отменяет то, что вставка нового файла выполняется с помощью Insert?

Пример запроса:
Код: sql
1.
2.
3.
4.
INSERT INTO Archive.dbo.Records
    VALUES (newid (), 3, 
      CAST ('Seismic Data' as varbinary(max)));
GO



Вы что, не знаете выполнить insert с помощью C#? оО

я знаю, как выполнить insert с помощью C#. Я не знаю, как инсертнуть конкретный файл: картинку, видео, аудио...
вот снова, в Вашем примере запроса идет просто вставка статически зашитого string-а.
А нужно конкретный файл вставить...
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570729
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchDessi,

http://msdn.microsoft.com/ru-ru/library/system.data.sqltypes.sqlfilestream.write(v=vs.110).aspx

а еще у SqlFileStream есть вот такой метод, позволяет писать сразу многобайтов...

этот метод видела. но я к сожалению не до конца понимаю параметр buffer. Если я укажу 512, к примеру, то что, из всего файла только 512 байт прочитает? или тут имеется в виду, что в поток запишется весь файл порциями по buffer байт?
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570743
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public void InsertFile(string fileName)
{
	if (!File.Exists(fileName)) return;
	var content = File.ReadAllBytes(fileNam);
	using(var connection = new SqlConnection("connection string"))
	{
		using(var command = new SqlCommand(connection, "insert into MyFileTable (file_guid, file_content) values (@file_guid, @file_content)"))
		{
			command.Parameters.AddWithValue("@file_guid", Guid.NewGuid());
			command.Parameters.AddWithValue("@file_content", content);
			
			command.ExecuteNonQuery();
		}
	}
}



Название таблицы, ее структура и количество параметров при вставке случайны.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570747
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

Он не прочитает а запишет.
buffer это контент в байтах, offset - это номер байта в buffer с которого начнется запись, length - сколько байтов, начиная с offset будет записано.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570778
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchDessi,

примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
public void InsertFile(string fileName)
{
	if (!File.Exists(fileName)) return;
	var content = File.ReadAllBytes(fileNam);
	using(var connection = new SqlConnection("connection string"))
	{
		using(var command = new SqlCommand(connection, "insert into MyFileTable (file_guid, file_content) values (@file_guid, @file_content)"))
		{
			command.Parameters.AddWithValue("@file_guid", Guid.NewGuid());
			command.Parameters.AddWithValue("@file_content", content);
			
			command.ExecuteNonQuery();
		}
	}
}
Вот к чему привела вставка файла в 1,5 Гб...
System.OutOfMemoryException was unhandled
  HResult=-2147024882
  Message=Exception of type 'System.OutOfMemoryException' was thrown.
  Source=mscorlib
  StackTrace:
       at System.IO.File.InternalReadAllBytes(String path, Boolean checkHost)
       at System.IO.File.ReadAllBytes(String path)
       at WindowsFormsApplication1.Form1.button7_Click(Object sender, EventArgs e) in c:\Users\Administrator\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 223
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at WindowsFormsApplication1.Program.Main() in c:\Users\Administrator\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 19
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 



Название таблицы, ее структура и количество параметров при вставке случайны.
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570781
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dessi,

большие желательно вставлять по-другому) записывая с помощью write небольшими кусками
...
Рейтинг: 0 / 0
Создание БД через WCF-сервис
    #38570796
Dessi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchDessi,

большие желательно вставлять по-другому) записывая с помощью write небольшими кусками
с помощью FileStream.Write имеете в виду?
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Создание БД через WCF-сервис
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]