2015-10-28 5 views
0

У меня есть пользовательское действие для проверки соединения SQL. Теперь он должен работать с кнопкой управления, но это не работает.WiX Custom Action start with Button

пользовательские действия хорошо работает без кнопки: Здесь WXS-файл:

<?xml version="1.0" encoding="UTF-8"?> 

<Property Id="SERVERNAME" Value="MSSQL2008R2" /> 
<Property Id="DATABASENAME" Value="MyDatabase" /> 
<Property Id="USERNAME" Value="admin" /> 
<Property Id="PASSWORD" Value="mypassword" /> 

<Binary Id="CA_SQLTestDLL" SourceFile="$(var.CA_SQLConnectionTest.TargetDir)CA_SQLConnectionTest.CA.dll" /> 
<CustomAction Id="SQL_Test" 
       BinaryKey="CA_SQLTestDLL" 
       DllEntry="ConnectionTest" 
       Execute="deferred" 
       Return="check" /> 
<SetProperty Id="SQL_Test" Value="SERVERNAME=[SERVERNAME];DATABASENAME=[DATABASENAME];USERNAME=[USERNAME];PASSWORD=[PASSWORD]" Sequence="execute" Before="SQL_Test" /> 

<InstallExecuteSequence> 
    <Custom Action="SQL_Test" After="InstallInitialize" /> 
</InstallExecuteSequence> 


<UI> 
    <Dialog Id="SQLServerConnectionTestDlg" Width="370" Height="270" Title="SQL Server connection test"> 
    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" /> 
    <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" /> 
    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)"> 
     <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> 
    </Control> 
    </Dialog> 
</UI> 

Вот мой CustomAction класс:

Imports System.Data 
Imports System.Data.SqlClient 
Public Class CustomActions 
<CustomAction()> _ 
Public Shared Function ConnectionTest(ByVal session As Session) As ActionResult 
session.Log("############## Begin CUSTOMACTION ##############") 
Dim userName As String 
Dim password As String 
Dim serverName As String 
Dim dataBase As String 

serverName = session.CustomActionData("SERVERNAME") 
dataBase = session.CustomActionData("DATABASENAME") 
userName = session.CustomActionData("USERNAME") 
password = session.CustomActionData("PASSWORD") 

Dim SqlConn As New SqlConnection 
Dim SqlConnStr As String = "Data Source=" + serverName + ";Database=" + dataBase + ";Persist Security Info=True;User ID=" + userName + ";Password=" + password 

If SqlConn.State = ConnectionState.Closed Then 
    SqlConn.ConnectionString = SqlConnStr 
    Try 
    SqlConn.Open() 
    Catch ex As Exception 
    Return ActionResult.Failure 
    End Try 
End If 
session.Log("### SUCCESSFULL ###") 
Return ActionResult.Success 
    End Function 

End Class 

install.log:

Calling custom action CA_SQLConnectionTest!CA_SQLConnectionTest.CustomActions.ConnectionTest 
############## Begin CUSTOMACTION ############## 
### SUCCESSFULL ### 

Теперь я хотел бы начать пользовательское действие с помощью кнопки. Поэтому я должен изменить Execute = «отложенными» Выполнить = «немедленно» и добавить кнопку:

 <Control Id="TestConn" Type="PushButton" X="265" Y="205" Width="70" Height="18" Text="&amp;Test Connection"> 
     <Publish Event="DoAction" Value="SQL_Test">1</Publish> 
     <Publish Property="ERRORMSG" Value="ConnectionTest">ACCEPTED = "1"</Publish> 
     <Publish Event="SpawnDialog" Value="InvalidDBConnDlg">ACCEPTED = "0"</Publish> 
    </Control> 

     <Dialog Id="InvalidDBConnDlg" Width="260" Height="120" Title="MyTester"> 
    <Control Id="OK" Type="PushButton" X="102" Y="90" Width="56" Height="17" Default="yes" Cancel="yes" Text="OK"> 
     <Publish Event="EndDialog" Value="Exit" /> 
    </Control> 
    <Control Id="Text" Type="Text" X="48" Y="22" Width="194" Height="60" Text="FAILED" /> 
    <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="WixUI_Ico_Info" /> 
    </Dialog> 

Теперь, когда я нажать на кнопку будет установка cancled и у меня есть фатальная ошибка в логе файла Файл:

Action 16:43:20: SQL_Test. 
Action start 16:43:20: SQL_Test. 
MSI (c) (5C:5C) [16:43:20:236]: Invoking remote custom action. DLL: C:\Users\LOC~1.CRE\AppData\Local\Temp\MSIC08C.tmp, Entrypoint: ConnectionTest 
Action ended 16:43:20: SQL_Test. Return value 3. 
MSI (c) (5C:20) [16:43:20:404]: Note: 1: 2205 2: 3: Error 
MSI (c) (5C:20) [16:43:20:404]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2896 
DEBUG: Error 2896: Executing action SQL_Test failed. 
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2896. The arguments are: SQL_Test, , 
Action ended 16:43:20: WelcomeDlg. Return value 3. 
MSI (c) (5C:54) [16:43:20:405]: Doing action: FatalError 
MSI (c) (5C:54) [16:43:20:405]: Note: 1: 2205 2: 3: ActionText 
Action 16:43:20: FatalError. 
Action start 16:43:20: FatalError. 
Action 16:43:20: FatalError. Dialog created 
Action ended 16:43:23: FatalError. Return value 2. 
Action ended 16:43:23: INSTALL. Return value 3. 
MSI (c) (5C:54) [16:43:23:488]: Destroying RemoteAPI object. 
MSI (c) (5C:50) [16:43:23:488]: Custom Action Manager thread ending 

Config useLegacyV2RuntimeActivationPolicy является "истинным"

Я использую WIX3.10 в Visual Studio 2013

Я не уверен, что я делаю WR Онг. Но я думаю, что это проблема с InstallExecuteSequence.

Я надеюсь, что кто-то может помочь мне, спасибо

ответ

0

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

Помимо этого, если код запускается и он терпит неудачу, это проблема кодирования/защиты окружающей среды. Вы должны просто поместить вызовы в поле кода в своем коде, пока вы находитесь на этом этапе отладки, убедитесь, что у вас есть значения, и, конечно же, делайте больше, чтобы просто избавиться от каких-либо исключений с помощью try/catch! Вы спрашиваете, какая ошибка может быть в то же самое время, когда вы отмените ее и вернете результат сбоя.

0

Спасибо, вы имеете право, это не проблема с последовательностью выполнения.

Я сузил проблему. Когда я не использую CustomActionData, то работает пользовательское действие

userName = session.CustomActionData("USERNAME") 
password = session.CustomActionData("PASSWORD") 
... 

Почему я не могу передать значения?

Update:

Команда оленья кожа»работа здесь:

session.CustomActionData("USERNAME") 

С помощью команды наблюдения работает отлично:

session("USERNAME") 
0

CustomActionData не могут быть доступны с немедленным пользовательских действий.

Но вы можете напрямую обращаться к свойствам с помощью сеансов.

попробовать это

userName = session["USERNAME"]; 
    password = session["PASSWORD"]; 
Смежные вопросы